Псевдоним для замены текста в файле

Вот практическая ситуация. Я сталкиваюсь с некоторыми из моих файлов, где в этих файлах есть общая строка. Обычно я открываю vi и делаю что-то вроде

:%s/text/replacement/g

и я должен сделать это во многих файлах много-много раз. Есть ли какой-нибудь простой способ сделать это или какой-то псевдоним, который я могу создать для того же?

3 ответа

Решение

Вы можете использовать find для поиска целевых файлов, а затем передать его в sed:

найти | xargs sed -i 's/foo/bar/g'

Заменить только в.txt файлах:

находить. -name "*.txt" -print | xargs sed -i 's/foo/bar/g'

(из этого сообщения в блоге)

Ах да, время для perl oneliner. Как насчет этого?

perl -pi -e 's/old text/new text/' file

или, может быть, вы хотите изменить все файлы *.txt в текущем каталоге? В этом случае, как насчет объединения его с GNU параллельно:

parallel perl -i.bak -pe 's/foo/bar/' ::: *.txt

С параллельным ::: означает использовать все после этого в качестве входных файлов.

или, чтобы изменить все текстовые файлы в текущем каталоге и ниже:

find . -name \*txt -print0 | parallel -q -0 perl -i.bak -pe 's/old text/new text/'

Обратите внимание -i.bak сохраняет резервную копию каждого файла, который вы изменяете, на случай, если вы допустите ошибку. Вы можете оставить это, если вы чувствуете себя опасно.

Во всяком случае, очевидно, sed Ответ является стандартным, но есть несколько забавных альтернативных способов сделать это тоже. Также, если у вас много файлов, параллельная работа gnu будет значительно быстрее, поскольку она будет запускать несколько копий параллельно (как можно было бы надеяться, учитывая имя).

Проверьте sed, что-то вроде этого:

sed -i 's/text/replacement/g' file
Другие вопросы по тегам