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
Shervan
источник

Ответы:

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 СЭД.

John1024
источник
@ fd0 Спасибо. Ответ обновлен, чтобы отметить отсутствие -sна BSD / OSX sed.
John1024 13.09.16
для GNU СЭД , -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
Стефан Шазелас
источник