вот практическая ситуация. Я сталкиваюсь с некоторыми из моих файлов, в которых есть общая строка. Обычно я открываю vi и делаю что-то вроде
:%s/text/replacement/g
и мне приходится делать это во многих файлах много-много раз. Есть ли какой-нибудь простой способ сделать это или какой-то псевдоним, который я могу создать для того же?
Ах да, время для перлового лайнера. Как насчет этого?
perl -pi -e 's/old text/new text/' file
или, может быть, вы хотите изменить все файлы * .txt в текущем каталоге? В таком случае, как насчет объединения его с GNU parallel:
parallel perl -i.bak -pe 's/foo/bar/' ::: *.txt
Параллельно с этим :::
средства используйте все после этого как входные файлы.
или изменить все txt файлы в текущем каталоге и ниже:
find . -name \*txt -print0 | parallel -q -0 perl -i.bak -pe 's/old text/new text/'
Обратите внимание -i.bak
сохраняет резервную копию каждого файла, который вы изменяете, на случай, если вы сделаете ошибку. Вы можете не указывать это, если чувствуете опасность.
В любом случае очевидно sed
Ответ стандартный, но есть и забавные альтернативные способы сделать это. Также, если у вас много файлов, gnu parallel будет значительно быстрее, поскольку он запускает несколько копий параллельно (как можно было бы надеяться, учитывая имя).
Вы можете использовать find для поиска целевых файлов, а затем передать его в sed:
найти | xargs sed -i 's / foo / bar / g'
Заменить только в файлах .txt:
найти . -name "* .txt" -print | xargs sed -i 's / foo / bar / g'
Посмотрите sed, примерно так:
sed -i 's/text/replacement/g' file