คุณสามารถใช้ perl one-liners ได้เหมือนกับที่คุณทำกับ sed ด้วยข้อได้เปรียบของการสนับสนุนการแสดงออกปกติของperlเต็มรูปแบบ(ซึ่งมีประสิทธิภาพมากกว่าสิ่งที่คุณได้รับจาก sed) นอกจากนี้ยังมีการเปลี่ยนแปลงน้อยมากในแพลตฟอร์ม * nix - โดยทั่วไปแล้ว perl จะเป็น perl ดังนั้นคุณจึงไม่ต้องกังวลว่าจะทำให้ sed เวอร์ชันเฉพาะของระบบของคุณทำในสิ่งที่คุณต้องการได้อย่างไร
ในกรณีนี้คุณสามารถทำได้
perl -pe 's/(regex)/\n$1/'
-pe
ทำให้ perl เป็นลูป "ดำเนินการและพิมพ์" เหมือนกับโหมดการทำงานปกติของ sed
'
ใส่เครื่องหมายคำพูดทุกอย่างเพื่อให้เชลล์ไม่รบกวน
()
โดยรอบ regex เป็นตัวดำเนินการจัดกลุ่ม $1
ทางด้านขวาของการเปลี่ยนตัวจะพิมพ์สิ่งที่จับคู่ไว้ใน parens เหล่านี้
สุดท้าย\n
เป็นนิวไลน์
ไม่ว่าคุณจะใช้วงเล็บเป็นตัวดำเนินการจัดกลุ่มหรือไม่ก็ตามคุณต้องออกจากวงเล็บที่คุณพยายามจับคู่ นิพจน์ทั่วไปที่ตรงกับรูปแบบที่คุณระบุไว้ด้านบนจะเป็นอย่างไร
\(\d\d\d\)\d\d\d-\d\d\d\d
\(
หรือ\)
จับคู่พาเรนตามตัวอักษรและ\d
จับคู่ตัวเลข
ดีกว่า:
\(\d{3}\)\d{3}-\d{4}
ฉันนึกภาพออกว่าตัวเลขในเครื่องหมายวงเล็บทำหน้าที่อะไร
นอกจากนี้คุณสามารถใช้ตัวคั่นอื่นที่ไม่ใช่ / สำหรับ regex ของคุณ ดังนั้นหากคุณต้องการจับคู่ / คุณไม่จำเป็นต้องหลบหนี ข้อใดข้อหนึ่งด้านล่างเทียบเท่ากับนิพจน์ทั่วไปที่จุดเริ่มต้นของคำตอบของฉัน ในทางทฤษฎีคุณสามารถแทนที่ อักขระใด ๆสำหรับมาตรฐาน / 's
perl -pe 's#(regex)#\n$1#'
perl -pe 's{(regex)}{\n$1}'
ความคิดสุดท้ายสองสาม
ใช้-ne
แทนการ-pe
ทำงานในลักษณะเดียวกัน แต่จะไม่พิมพ์ตอนท้ายโดยอัตโนมัติ อาจเป็นประโยชน์หากคุณต้องการพิมพ์ด้วยตัวคุณเอง เช่นนี่คือ grep-alike ( m/foobar/
เป็นการจับคู่นิพจน์ทั่วไป):
perl -ne 'if (m/foobar/) {print}'
-l
หากคุณกำลังมองหาการจัดการกับการขึ้นบรรทัดใหม่ลำบากและคุณต้องการที่จะได้รับการจัดการอย่างน่าอัศจรรย์สำหรับคุณเพิ่ม ไม่มีประโยชน์สำหรับ OP ที่ทำงานกับข่าวใหม่
เคล็ดลับโบนัส - หากคุณติดตั้งแพ็คเกจ pcre มาพร้อมกับpcregrep
ซึ่งใช้ regexes ที่เข้ากันได้กับ perl เต็มรูปแบบ
sed '/regex/G'