วิธีแทรกข้อความหลังสตริงที่ต้องการในไฟล์ได้อย่างไร?


69

ตอนนี้ฉันกำลังใช้echo "Hello World" >> file.txtต่อท้ายข้อความในไฟล์ แต่ฉันต้องเพิ่มข้อความด้านล่างสตริงที่แน่นอนสมมติว่า "[ตัวเลือก]" มันเป็นไปได้ด้วยsedหรือไม่

เช่น:

ใส่ไฟล์

Some text
Random
[option]
Some stuff

ไฟล์ที่ส่งออก

Some text
Random
[option]
*inserted text*
Some stuff

1
คุณต้องเจาะจงมากขึ้นและให้ข้อความตัวอย่างแก่ผู้อื่นเพื่อช่วยคุณในการใช้คำสั่งที่แน่นอน
ผ่อนผัน

โปรดแก้ไขคุณ Q และแสดงinputและoutputเส้น เพราะคุณคิวไม่ชัดเจน คุณสามารถทำได้echo "Hello World [option]" >> file.txtแต่มันก็ไม่สมเหตุสมผล

ฉันแก้ไขคำถามเพื่อให้ข้อมูลเพิ่มเติมสำหรับการอ้างอิง แต่คำตอบที่ยอมรับได้คือสิ่งที่ฉันพยายามทำให้สำเร็จ
Javier Villanueva

หากคุณเพียงต้องการแก้ไขไฟล์กำหนดค่านี่เป็นทางออกที่ดีที่สุดที่ฉันพบ: unix.stackexchange.com/a/78076/20661
rubo77

คำตอบ:


104

ต่อท้ายบรรทัดหลังการแข่งขัน

  • sed '/\[option\]/a Hello World' input

แทรกบรรทัดก่อนการแข่งขัน

  • sed '/\[option\]/i Hello World' input

นอกจากนี้คุณสามารถสำรองข้อมูลและแก้ไขไฟล์อินพุตแบบ in-place โดยใช้-i.bkpตัวเลือกเพื่อ sed


2
ใน osx ฉันได้รับsed: 1: "/pattern/a some text here": command a expects \ followed by text
the_prole


สำหรับ Mac OSX ฉันต้องเพิ่ม\ <<NEWLINE>>หลังจากaตัวเลือก
Tom Howard

รหัสด้านบนจะผนวก / แทรกบรรทัดสำหรับการแข่งขันทุกนัด หากคุณต้องการผนวก / แทรกบรรทัดสำหรับคู่แรกเท่านั้นคุณสามารถ0,เพิ่มคำสั่ง: sed '0,/\[option\]/a Hello World' inputหรือsed '0,/\[option\]/i Hello World' input
kimbaudi

33

ใช่เป็นไปได้ด้วยsed:

sed '/pattern/a some text here' filename

ตัวอย่าง:

$ cat test
foo
bar
option
baz
$ sed '/option/a insert text here' test
foo
bar
option
insert text here
baz
$

2
@javiervd ฉันไม่แน่ใจว่าคุณหมายถึงอะไรโดยคำตอบแรก? หากคุณหมายถึงก่อนตามเวลาที่ตอบแล้วคุณผิด คุณไม่ได้สังเกตการประทับเวลาอย่างระมัดระวัง!
devnull

มีวิธีเพิ่มหลังจากการจับคู่สตริงล่าสุดหรือไม่ ตัวอย่างเช่นfoo bar option bar option baz . ดังนั้นรูปแบบจึงกลายเป็น foo bar option bar option addedstring baz ?
Ari

4

ด้วยawk:

awk '1;/PATTERN/{ print "add one line"; print "\\and one more"}' infile

โปรดทราบว่าตัวละครบางตัวไม่สามารถรวมตัวอักษรดังนั้นหนึ่งมีการใช้ลำดับหนี (พวกเขาเริ่มต้นด้วยเครื่องหมาย) \\เช่นการพิมพ์เครื่องหมายอักษรหนึ่งที่มีการเขียน

จริงๆแล้วมันจะเหมือนกันsedแต่นอกจากนี้แต่ละบรรทัดใหม่ที่ฝังอยู่ในข้อความจะต้องมีแบ็กสแลชนำหน้าด้วย:

sed '/PATTERN/a\
add one line\
\\and one more' infile

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับลำดับหลีกเลี่ยงดูคู่มือ


บรรทัด awk ไม่ได้เปลี่ยนข้อความจริงเพียงส่งออก
Josef Klimuk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.