Я запустил следующее, чтобы заменить термин, используемый во всех файлах в текущем рабочем каталоге:
$ find . -type f -print0 | xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'
Это выполняло подстановку слова, но также создавало .bup
файлы файлов, которые никогда не имели Ms. Johnson
строки.
Как выполнить замену, не создавая все эти ненужные резервные копии?
linux
shell-script
scripting
sed
Бельмин Фернандес
источник
источник
ex
и условно (только если файл изменен), выполняемый:!cp '%' '%.bup'
перед сохранением и выходом. Может быть стоит посмотреть.vi
стеке обмена.Ответы:
Вы можете проверить содержимое файлов, чтобы убедиться, что подстановка будет иметь место при работе
sed
с ними:Если вы хотите быть действительно умным, вы можете
find
вообще отказаться от использования :источник
'{}'
раз перед тем, как ты\;
в этом-exec
.В Find есть
-exec
оператор, который выполняет произвольную команду. Более того,-exec
это тест , так что вы можете-exec
объединить несколько s вместе, и если более ранние команды не пройдут, более поздние не будут выполнены. Строка{}
заменяется текущим именем файла и;
отмечает конец команды. Вы должны процитировать оба, чтобы избежать вмешательства оболочки.Так:
источник
{}
в пустую строку при выполнении фигурных скобок.Я посмотрел на справочную страницу и не нашел способа сделать это напрямую
sed
, как я уверен, что вы сделали, прежде чем спрашивать. Я вижу несколько способов обойти это с помощью grep, но я думаю, что самый простой это:-r
recurse-l
print filename только-Z
конечные имена с нулемисточник
Похоже, вам нужно сначала создать список файлов, которые соответствуют вашим условиям поиска.
источник
.
как первый аргументfind
. Кроме того, как мне сообщили не так давно, на самом деле вам не нужно цитировать или избегать{}
find
генерируется список файлов, разделенных новой строкой, затем оболочка разбивает этот список на любые пробелы (не только на новые строки), а затем оболочка обрабатывает каждое слово как шаблон глобуса. Это работает, только если ваши имена файлов не содержат пробелов или\[?*
. Другие ответы на этой странице показывают, как это сделать правильно..
find нет необходимости (по крайней мере, find найдено в linux), потому что он предполагается, когда аргумент не передан пути.