นี่คือไฟล์ตัวอย่าง:
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
) การดำเนินการเริ่มต้นคือการพิมพ์เรกคอร์ดปัจจุบัน