Sed แทนประโยคในหลายบรรทัด


11

ฉันยังใหม่กับการใช้ sed แต่ฉันได้ทดลองใช้ sed s/..../..../(ทดแทน) ของ sed เพื่อแก้ไขประโยคเต็มถ้ามันอยู่ในบรรทัดเดียว แต่ฉันไม่รู้วิธีอื่นในการแก้ไขประโยคที่อาจแยกจากสองบรรทัดเช่น:

นี้:

Lorem Ipsum is simply dummy text of the printing and typesetting industry.

มีการเขียนจริงเช่นนี้:

Lorem Ipsum is simply dummy text of the 
printing and typesetting industry.

คุณจะตรวจหารหัสนี้หรือมันเพื่อแทนที่ทั้งประโยคแม้ว่าจะเป็นสองบรรทัดแทนที่จะเป็นหนึ่งบรรทัดได้อย่างไร


หนังสืออ้างอิงที่ยอดเยี่ยม: คู่มือสรุปการสอนและอ้างอิงโดย Daniel A. Goldman ISBN: 978-1-939824-01-1 (รุ่น EPUB) 08148804441822
Joe

คำตอบ:


16

คำสั่งต่อไปนี้จะทำงานในทั้งสองสถานการณ์:

sed '/Lorem.*/ {N; s/Lorem.*industry\./string to replace/g}' filename

คำอธิบายเพิ่มเติม: ฉันจะใช้ sed เพื่อแทนที่สตริงหลายบรรทัดได้อย่างไร


3
@Gilles ฉันเข้าใจความตั้งใจที่ดีของคุณ แต่โปรดลองทดสอบก่อนเพื่อทำให้คำตอบของฉันยุ่งเหยิง ดีกว่าถ้าคุณมีความคิดเห็นอื่นคือการเพิ่มคำตอบหรือแสดงความคิดเห็น
Radu Rădeanu


@Gilles ได้โปรดคุณไม่จำเป็นต้องเป็นคนซุกซน คุณควรทราบว่า"รหัส" ของคุณแทนที่อย่างไม่มีอะไร ดังที่ฉันพูดฉันเข้าใจความตั้งใจดีของคุณ จากตัวอย่างของฉันฉันคิดว่า OP เข้าใจวิธีเปลี่ยนประโยคในหลายบรรทัดด้วยsedไม่มีอะไรเพิ่มเติม และนี่คือคำถามชื่อ perlชื่อเรื่องไม่ได้เกี่ยวกับ
Radu Rădeanu

ไม่รหัสที่ฉันโพสต์ใช้งานได้ (ยกเว้นถ้าLoremอยู่ในบรรทัดสุดท้ายข้อบกพร่องที่ใช้ร่วมกับเวอร์ชันของคุณ)
Gilles 'เลิกเป็นคนชั่ว'

ตัวอย่างนี้ไม่ทำงานเมื่อมีข้อความอย่างน้อย 3 บรรทัด :(
artnikpro

12

ในขณะที่ sed สามารถจับคู่รูปแบบในหลายบรรทัด (ใช้คำสั่งNหรือHต่อท้ายบรรทัดต่อเนื่องก่อนการจับคู่) สิ่งนี้อยู่นอกเขตความสะดวกสบาย พยายามมันเฉพาะถ้าคุณชอบความเจ็บปวด

Perl สามารถทำสิ่งนี้ได้เป็นอย่างดี ใช้-pสวิตช์เพื่อดำเนินการอินพุตมาตรฐานหนึ่งเรคคอร์ดในเวลาเดียวกันและพิมพ์เรคคอร์ดที่แก้ไข (à la sed) และ-000เพื่อเปิดโหมดย่อหน้า (โดยที่เรคคอร์ดถูกคั่นด้วยบรรทัดว่าง) ในนิพจน์ทั่วไปให้\sจับคู่อักขระช่องว่างรวมถึงการขึ้นบรรทัดใหม่

perl -p -000 -e 's/Lorem\s+Ipsum\s+is\s+simply\s+dummy\s+text\s+of\s+the\s+printing\s+and\s+typesetting\s+industry\./Replacement text/g'

หากคุณต้องการขึ้นบรรทัดใหม่ในข้อความแทนที่เมื่อต้นฉบับมีหนึ่งบรรทัดนั่นจะซับซ้อนกว่า วิธีการทำขึ้นอยู่กับความต้องการของคุณว่าจะขึ้นบรรทัดใหม่อย่างไร


@terdon อาฉันหมายถึงอนุญาตช่องว่างหลาย ๆ ที่ แต่ลืมไป ขอบคุณคง
Gilles 'หยุดความชั่วร้าย'

sedคำถามที่เป็นเรื่องเกี่ยวกับ นอกจากนี้ยังมีแท็กไม่ได้กับsed perl
Radu Rădeanu

0

sed ไม่สามารถอ่านข้ามหลายบรรทัดได้อย่างง่ายดาย ใช้perl -i -0pe 's/.../.../...'แทน


7
sed สามารถอ่านได้หลายบรรทัด!
Radu Rădeanu

3
@ RaduRădeanuในทางเทคนิคแล้วใช่ แต่มันก็ไม่ค่อยคุ้มกับปัญหา
Gilles 'หยุดชั่วร้าย'

3
@Gilles หากใช้perlง่ายกว่าสำหรับคุณนี่ไม่ได้หมายความว่าsedคุ้มค่ากับปัญหา
Radu Rădeanu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.