sed - terapkan perubahan pada banyak file


11

Saya memiliki ratusan file yang berisi " </foo:bar>"

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

Saya ingin mengubahnya sekaligus

cc
bb
aa
</foo:bar>

sed berfungsi dengan baik ketika saya memberikannya nama file yang tepat

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

tetapi ketika saya mencoba mengubah semuanya sekaligus saya tidak mendapatkan hasil.

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

Jawaban:


19

Mencoba:

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

-s memberitahu sed untuk memperlakukan setiap file sebagai terpisah.

Karena kami tidak ingin sedberhenti sampai semua file selesai, kami mengubah untuk hanya mencetak dari awal menjadi <\/foo:bar>dan tidak mencetak sisa baris. -nmengatakan sed tidak mencetak kecuali kita secara eksplisit memintanya. Perintah 0,/<\/foo:bar>/pmemberitahu sed untuk mencetak baris apa saja dalam rentang dari awal file ke baris pertama yang cocok <\/foo:bar>.

The -sopsi ini tidak tersedia untuk BSD / OSX sed.


@ fd0 Terima kasih. Jawaban diperbarui untuk mencatat kurangnya -sBSD / OSX sed.
John1024

untuk GNU , -iopsi menyiratkan -s... apakah ada sedimplementasi di mana solusi ini tidak akan bekerja tanpa -sopsi?
Sundeep

7

Untuk berhenti membaca file ketika </foo:bar>ditemukan:

Dengan GNU awk:

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

Dengan perl:

perl -ni -e 'print; close ARGV if $_ eq "</foo:bar>\n"' ./*.txt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.