sed - değişiklikleri birden fazla dosyaya uygula


11

" </foo:bar>" İçeren yüzlerce dosyam var

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

Hepsini aynı anda değiştirmek istiyorum

cc
bb
aa
</foo:bar>

sed tam dosya adı verdiğinde iyi çalışıyor

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

ama hepsini birden değiştirmeye çalıştığımda sonuç alamıyorum.

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

Yanıtlar:


19

Deneyin:

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

-s sed'e her dosyaya ayrı davranılmasını söyler.

sedTüm dosyalar bitene kadar çıkmak istemediğimizden <\/foo:bar>, satırların geri kalanını basmak yerine sadece baştan yazdırmaya değiştiririz . -nsed'e açıkça sormadıkça baskı yapmamasını söyler. Komut 0,/<\/foo:bar>/p, sed'e dosyanın başlangıcından eşleşen ilk satıra kadar herhangi bir satır yazdırmasını söyler <\/foo:bar>.

Bu -sseçenek BSD / OSX sed için mevcut değildir.


@ fd0 Teşekkürler. Cevap -sBSD / OSX sed eksikliğini not etmek için güncellendi .
John1024

için sed GNU , -iseçenek ima -s... bir var seduygulama nerede bu çözüm olmadan işleyecek -sseçeneği?
Sundeep

7

Bulunduğunda dosyaları okumayı durdurmak için </foo:bar>:

GNU ile awk:

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

İle perl:

perl -ni -e 'print; close ARGV if $_ eq "</foo:bar>\n"' ./*.txt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.