У меня есть каталог с несколькими подкаталогами, которые содержат текстовые файлы. В этих текстовых файлах есть определенное слово, которое встречается снова и снова, и я хочу заменить каждый экземпляр.

Мой вопрос - Как бы я достиг этого из командной строки Linux? Я не хочу gedit каждый файл и выполнить поиск / замену вручную.

(Для бонуса - есть ли способ сделать это без учета регистра?)

2 ответа2

5

Вы можете использовать find и perl (через xargs):

find /target/directory -type f | xargs perl -pi -e 's/stringtoreplace/replacement/g'

или если вы уже находитесь в правильном каталоге

find . -type f | xargs perl -pi -e 's/stringtoreplace/replacement/g'

и если вы хотите заменить только, скажем, HTML-файлы:

find . -type f -name '*html' | xargs perl -pi -e 's/stringtoreplace/replacement/g'

Конечно, вам не нужно использовать Perl, подойдет любой инструмент, который выполняет операции поиска и замены, и, несомненно, есть несколько доступных ресурсов, которые менее ресурсоемки, чем запуск Perl (что в данном случае является кувалдой для взлома орешек, но это пример, который я хранил целую вечность, и у меня нет причин искать более эффективную версию). Мой оригинальный источник для "трюк" http://oreilly.com/pub/h/73

Вы можете использовать все параметры, которые вы выбираете для любого инструмента, так что в этом случае вся мощь регулярных выражений Perl. На странице, на которую есть ссылки, приведено больше примеров, в том числе о поиске без учета регистра.

1

Я полагаю, что с вашей точки зрения вас может заинтересовать решение с использованием GNU Parallel http://www.gnu.org/software/parallel/

find /target/directory -type f | parallel perl -pi -e 's/stringtoreplace/replacement/ig'

Это решение выполняет замену параллельно и нечувствительно к регистру. GNU Parallel не страдает от проблемы разделителя http://en.wikipedia.org/wiki/Xargs#The_separator_problem - только если у вас есть имена файлов, содержащие переводы строк, вам понадобится комбинация -print0/-0.

Посмотрите вступительное видео для GNU Parallel: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .