рекурсивно замените каждый экземпляр слова в каталоге из командной строки Linux

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

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

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

0
задан 10.07.2010, 22:14

2 ответа

Вы могли использовать 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'

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

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

5
ответ дан 24.11.2019, 02:55

От Вашего дескриптора я полагаю, что Вы могли бы интересоваться решением с помощью Параллели GNU http://www.gnu.org/software/parallel/

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

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

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

1
ответ дан 24.11.2019, 02:55

Теги

Похожие вопросы