Bash: любая команда для замены строк в текстовых файлах? - PullRequest
3 голосов
/ 18 мая 2010

У меня есть иерархия каталогов, содержащих много текстовых файлов. Я хотел бы искать определенную текстовую строку каждый раз, когда она появляется в одном из файлов, и заменять ее другой строкой. Например, я могу захотеть заменить каждое вхождение строки "Coke" на "Pepsi". Кто-нибудь знает как это сделать? Мне интересно, есть ли какая-нибудь команда Bash, которая может сделать это без необходимости загружать все эти файлы в редакторе или придумать более сложный сценарий для этого.

Я нашел эту страницу , объясняющую трюк с использованием sed, но, похоже, он не работает с файлами в подкаталогах.

Ответы [ 7 ]

15 голосов
/ 18 мая 2010

Используйте sed в сочетании с find. Например:

find . -name "*.txt" | xargs sed -i s/Coke/Pepsi/g

или

find . -name "*.txt" -exec sed -i s/Coke/Pepsi/g {} \;

(дополнительную информацию см. В справочной странице)

3 голосов
/ 18 мая 2010

find . -type f -exec sed -i 's/old-word/new-word/g' {} \;

3 голосов
/ 18 мая 2010

Объедините sed с находкой, подобной этой:

find . -name "file.*" -exec sed -i 's/Coke/Pepsi/g' {} \;
3 голосов
/ 18 мая 2010

IMO, инструмент с самым простым использованием для этой задачи: rpl:

rpl -R Coke Pepsi .

(-R для рекурсивной замены во всех подкаталогах)

2 голосов
/ 18 мая 2010

Вы хотите комбинацию find и sed

2 голосов
/ 18 мая 2010

Я обычно делаю это на Perl. Однако будьте осторожны - он использует регулярные выражения, которые намного мощнее, чем обычные подстановки строк:

% perl -pi -e 's/Coke/Pepsi/g;' $filename

РЕДАКТИРОВАТЬ Я забыл о подкаталогах

% find ./ -exec perl -pi -e 's/Coke/Pepsi/g;' {} \;
0 голосов
/ 28 июня 2010

Вы также можете:

Поиск и замена на find & ed

http://codesnippets.joyent.com/posts/show/2299

(который также имеет тестовый режим с помощью флага -t)

...