นี่คือไฟล์ตัวอย่าง:
somestuff...
all: thing otherthing
some other stuff
สิ่งที่ฉันต้องการทำคือเพิ่มในบรรทัดที่ขึ้นต้นด้วยall:สิ่งนี้:
somestuff...
all: thing otherthing anotherthing
some other stuff
นี่คือไฟล์ตัวอย่าง:
somestuff...
all: thing otherthing
some other stuff
สิ่งที่ฉันต้องการทำคือเพิ่มในบรรทัดที่ขึ้นต้นด้วยall:สิ่งนี้:
somestuff...
all: thing otherthing anotherthing
some other stuff
คำตอบ:
สิ่งนี้ใช้ได้กับฉัน
sed '/^all:/ s/$/ anotherthing/' file
ส่วนแรกเป็นรูปแบบที่ต้องค้นหาและส่วนที่สองคือการแทนที่ของ sed ธรรมดาโดยใช้$สำหรับจุดสิ้นสุดของบรรทัด
หากคุณต้องการเปลี่ยนไฟล์ในระหว่างกระบวนการให้ใช้-iตัวเลือก
sed -i '/^all:/ s/$/ anotherthing/' file
หรือคุณสามารถเปลี่ยนเส้นทางไปยังไฟล์อื่น
sed '/^all:/ s/$/ anotherthing/' file > output
สิ่งนี้ควรได้ผลสำหรับคุณ
sed -e 's_^all: .*_& anotherthing_'
การใช้คำสั่ง s (แทน) คุณสามารถค้นหาบรรทัดที่ตรงตามนิพจน์ทั่วไป ในคำสั่งด้านบน&หมายถึงสตริงที่ตรงกัน
คุณสามารถต่อท้ายข้อความ$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
awk: can't set $0
/usr/xpg4/bin/awkซึ่งเป็น awk "ดี"
ในการทุบตี:
while read -r line ; do
[[ $line == all:* ]] && line+=" anotherthing"
echo "$line"
done < filename
นี่เป็นอีกวิธีง่ายๆโดยใช้ sed
$ sed -i 's/all.*/& anotherthing/g' filename.txt
คำอธิบาย:
all. * หมายถึงทุกบรรทัดที่ขึ้นต้นด้วย 'all'
& แสดงการจับคู่ (เช่นบรรทัดที่สมบูรณ์ที่ขึ้นต้นด้วย 'ทั้งหมด')
จากนั้น sed แทนที่คำเดิมด้วยคำในภายหลังและต่อท้ายคำว่า 'anotherthing'
วิธีแก้ปัญหาด้วย awk:
awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file
เพียงแค่: ถ้าแถวเริ่มต้นด้วยการallพิมพ์แถวบวก "อื่น ๆ " ให้พิมพ์เฉพาะแถวนั้น
awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
condition {actions}คู่ หากconditionละเว้นการดำเนินการจะดำเนินการสำหรับทุกระเบียน หาก{actions}ถูกละไว้และเงื่อนไขประเมินเป็นจริง (ซึ่งเป็นกรณีของตัวเลข1) การดำเนินการเริ่มต้นคือการพิมพ์เรกคอร์ดปัจจุบัน