2014-10-15 2 views
1

Я пытаюсь удалить все строки со словом «котята» из текстового файла на моем mac. Я использую find с xargs для этого, но он не работает. Раньше я пытался использовать sed с опцией изменения на месте, но безрезультатно. Как я могу заменить каждый файл с помощью команды awk?Использование xargs с awk для изменения файлов на месте (на Mac!)

gfind -iname "dogs_kittens.txt" -type f -print0 | xargs -0 -0 -I %in <awk '!/kittens/{print}' %in > %in 
+0

Вы пробовали передать пустой аргумент переключателю -i? По-видимому, это требуется для версии Mac. См. Один из комментариев по этому вопросу: http://stackoverflow.com/a/5410784/153430 –

+0

change '>% in' to'> tmp && mv tmp% в –

ответ

0

Если вы готовы попробовать sed снова это должно быть просто:

gfind -iname "dogs_kittens.txt" -type f -execdir sed -i .meow '/kittens/d' {} + 
0

Я не уверен, почему вы используете gfind для этого, как СЭД само по себе должно быть достаточно:

sed -i '' '/kittens/d' dogs_kittens.txt 

на OS X в-месте место редактирования требует, чтобы использовать его с -i(space)'' для перезаписи файла ввода.

+0

Я бы предположил, что это было потому, что было несколько файлов под поиском каталога. –

+0

@JohnZwinck, Да, хотя они не упоминали все файлы, просто «из текстового файла». Кроме того, 'gfind' не является родным для OS X версии GNU Utils, по крайней мере, не того, что я видел. –

0

Если вы можете использовать последнюю версию GNU awk, для этого есть опция -i inplace.

0

Я думаю, что-то вроде этого будет вполне подходящим:

awk '!/kittens/' dogs_kittens.txt > tmp && mv tmp dogs_kittens.txt 

Для каждой строки, которая не соответствует /kittens/, выполнять действия по умолчанию, который должен напечатать строку.