sed - ใช้การเปลี่ยนแปลงในหลายไฟล์


11

ฉันมีหลายร้อยไฟล์ซึ่งมี " </foo:bar>"

cc
bb
aa
</foo:bar>
dd
xx
vv

ฉันต้องการเปลี่ยนพวกเขาทั้งหมดในครั้งเดียวเพื่อ

cc
bb
aa
</foo:bar>

sed ทำงานได้ดีเมื่อฉันให้ชื่อไฟล์ที่แน่นอน

sed -i "/ </ foo: bar> / q" 99999.txt

แต่เมื่อฉันพยายามที่จะเปลี่ยนพวกเขาทั้งหมดในครั้งเดียวฉันไม่ได้รับผล

 sed -i "/<\/foo:bar>/q" *.txt

คำตอบ:


19

ลอง:

sed -s -n -i '0,/<\/foo:bar>/p' *.txt

-s บอกให้จัดการกับแต่ละไฟล์แยกกัน

เนื่องจากเราไม่ต้องการsedออกจนกว่าจะเสร็จสิ้นไฟล์ทั้งหมดเราจึงเปลี่ยนเป็นเพียงพิมพ์ตั้งแต่ต้นจนถึง<\/foo:bar>และไม่พิมพ์บรรทัดที่เหลือ -nแจ้งให้ทราบว่าไม่ได้พิมพ์เว้นแต่เราจะขอให้มันอย่างชัดเจน คำสั่ง0,/<\/foo:bar>/pบอก sed พิมพ์บรรทัดใด ๆ <\/foo:bar>ในช่วงตั้งแต่จุดเริ่มต้นของไฟล์ที่จะสายแรกที่การแข่งขัน

-sตัวเลือกที่ไม่สามารถใช้ได้สำหรับ BSD / OSX sed


@ fd0 ขอบคุณ คำตอบได้รับการอัปเดตเพื่อให้ทราบถึงการขาด-sBSD / OSX sed
John1024

สำหรับGNU sed , -iตัวเลือกหมายถึง-s... จะมีsedการดำเนินการที่แก้ปัญหานี้จะไม่ทำงานโดยไม่ต้อง-sตัวเลือก?
Sundeep

7

หากต้องการหยุดอ่านไฟล์เมื่อ</foo:bar>พบ:

ด้วย GNU awk:

gawk -i inplace '{print}; $0 == "</foo:bar>" {nextfile}' ./*.txt

ด้วยperl:

perl -ni -e 'print; close ARGV if $_ eq "</foo:bar>\n"' ./*.txt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.