Есть ли способ запустить пробный рекурсивный поиск и заменить его sed
, прежде чем запускать его? Я просто хочу распечатать результаты, прежде чем делать поиск и замену. Что-то вроде повторения результатов,
grep -rl term1 . |xargs sed -i -e 's/term1/term2/'
Ответы:
Вы можете запустить
sed
без-i
и шаг за шагом с выходомless
Затем запустите
sed
с-i.bak
для создания резервных копий , которые вы можете Diff впоследствииИзменить: как предлагается в комментарии, используйте
grep --null | xargs -0
. Это приводит к тому, что имена файлов заканчиваются нулевым байтом, что делает его безопасным для имен файлов с необычными символами, такими как символ новой строки. Да,\n
является допустимым символом в имени файла Unix. Единственными запрещенными символами являются слеш/
и нулевой символ\0
источник
grep -rl --null
поскольку в OP не указана ОС, и это-Z
означает что-то другое в BSD / OSX (распаковка).--null
одинаково на GNU и BSDgrep
это GNU grep для FreeBSD и NetBSD. На NetBSD-Z
все еще означает--null
(согласно странице руководства), но я согласен --null более переносим. Также обратите внимание, что ни --null, ни -Z не работают на OpenBSDsed -i '' -e s/.../
в BSDsed
(там нет опций)Используйте
sed
сfind
вместоgrep
Прежде всего, я бы использовал,
find
а неgrep
, и это по трем причинам:find
позволяет более точный выбор файлов. Например,grep -r string *.txt
выдаст файлы только в текущем каталоге; не те в подкаталогах.find
поставляется с мощной-exec
опцией, которая устраняет необходимость всей--null … |xargs 0
конструкции.-readable
и-writable
вариантыfind
помешают тратить время на файлы , которые не могут быть доступны.Тест захвата
Тем не менее,
grep
подходит ли для первого теста, чтобы увидеть, что будет захвачено:или более конкретно:
Прогон, репетиция
Теперь приступайте к
sed
пробному запуску.sed
Вариантом-n
является синонимом--quiet
иp
в самом концеsed
выражения напечатает текущее пространство картины.или более конкретно:
выполнение
Если все выглядит нормально, выдает окончательную команду, заменив
sed
опцию-n
на-i
для «на месте» и удаленияp
в конце.или более конкретно:
Больше
find
примеровБольше
find
примеров можно найти здесь .источник