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 обробляти кожен файл окремо.

Оскільки ми не хочемо sedвиходити, поки всі файли не будуть виконані, ми змінюємо лише друк від початку до, <\/foo:bar>а не друкуємо решту рядків. -nкаже sed не друкувати, якщо ми прямо не попросимо цього. Команда 0,/<\/foo:bar>/pзадає sed надрукувати будь-який рядок у діапазоні від початку файлу до першого рядка, який відповідає <\/foo:bar>.

-sОпція не доступна для BSD / OSX СЕД.


@ fd0 Дякую Відповідь оновлено, щоб відзначити відсутність -sна BSD / 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.