จะเพิ่มที่ท้ายบรรทัดที่มีรูปแบบด้วย sed หรือ awk ได้อย่างไร?


89

นี่คือไฟล์ตัวอย่าง:

somestuff...
all: thing otherthing
some other stuff

สิ่งที่ฉันต้องการทำคือเพิ่มในบรรทัดที่ขึ้นต้นด้วยall:สิ่งนี้:

somestuff...
all: thing otherthing anotherthing
some other stuff

คำตอบ:


168

สิ่งนี้ใช้ได้กับฉัน

sed '/^all:/ s/$/ anotherthing/' file

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

หากคุณต้องการเปลี่ยนไฟล์ในระหว่างกระบวนการให้ใช้-iตัวเลือก

sed -i '/^all:/ s/$/ anotherthing/' file

หรือคุณสามารถเปลี่ยนเส้นทางไปยังไฟล์อื่น

sed '/^all:/ s/$/ anotherthing/' file > output

เพียงเพิ่มบางสิ่งบางอย่างนำไปสู่บรรทัดใหม่แทนที่เป็นวิธีที่ถูกต้อง
zhy

11

สิ่งนี้ควรได้ผลสำหรับคุณ

sed -e 's_^all: .*_& anotherthing_'

การใช้คำสั่ง s (แทน) คุณสามารถค้นหาบรรทัดที่ตรงตามนิพจน์ทั่วไป ในคำสั่งด้านบน&หมายถึงสตริงที่ตรงกัน


10

คุณสามารถต่อท้ายข้อความ$0ใน awk ได้หากตรงกับเงื่อนไข:

awk '/^all:/ {$0=$0" anotherthing"} 1' file

คำอธิบาย

  • /patt/ {...}ถ้าเส้นตรงกับรูปแบบที่ได้รับจากนั้นดำเนินการตามที่อธิบายไว้ภายในpatt{}
  • ในกรณีนี้: /^all:/ {$0=$0" anotherthing"}ถ้าบรรทัดเริ่มต้น (แสดงโดย^) ด้วยall:ให้ต่อท้ายanotherthingบรรทัด
  • 1เป็นเงื่อนไขจริงทริกเกอร์การดำเนินการเริ่มต้นของawk: พิมพ์บรรทัดปัจจุบัน ( print $0) สิ่งนี้จะเกิดขึ้นเสมอดังนั้นมันจะพิมพ์บรรทัดเดิมหรือบรรทัดที่แก้ไข

ทดสอบ

สำหรับข้อมูลที่คุณระบุจะส่งกลับ:

somestuff...
all: thing otherthing anotherthing
some other stuff

โปรดทราบว่าคุณสามารถระบุข้อความที่จะต่อท้ายตัวแปรได้:

$ awk -v mytext=" EXTRA TEXT" '/^all:/ {$0=$0mytext} 1' file
somestuff...
all: thing otherthing EXTRA TEXT
some other stuff

ใน Solaris คุณจะได้รับข้อผิดพลาด:awk: can't set $0
สิ้นสุด

@ceving แล้วคุณสามารถใช้/usr/xpg4/bin/awkซึ่งเป็น awk "ดี"
fedorqui 'SO หยุดทำร้าย'


6

นี่เป็นอีกวิธีง่ายๆโดยใช้ sed

$ sed -i 's/all.*/& anotherthing/g' filename.txt

คำอธิบาย:

all. * หมายถึงทุกบรรทัดที่ขึ้นต้นด้วย 'all'

& แสดงการจับคู่ (เช่นบรรทัดที่สมบูรณ์ที่ขึ้นต้นด้วย 'ทั้งหมด')

จากนั้น sed แทนที่คำเดิมด้วยคำในภายหลังและต่อท้ายคำว่า 'anotherthing'


4

วิธีแก้ปัญหาด้วย awk:

awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file

เพียงแค่: ถ้าแถวเริ่มต้นด้วยการallพิมพ์แถวบวก "อื่น ๆ " ให้พิมพ์เฉพาะแถวนั้น


4
คุณสามารถย่อให้สั้นลงเป็น:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
glenn jackman

2
@Prometheus สคริปต์ awk ประกอบด้วยcondition {actions}คู่ หากconditionละเว้นการดำเนินการจะดำเนินการสำหรับทุกระเบียน หาก{actions}ถูกละไว้และเงื่อนไขประเมินเป็นจริง (ซึ่งเป็นกรณีของตัวเลข1) การดำเนินการเริ่มต้นคือการพิมพ์เรกคอร์ดปัจจุบัน
glenn jackman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.