Вы имеете в виду поиск и заменяете строку во всех файлах, подобранных grep?
perl -p -i -e 's/oldstring/newstring/g' `grep -ril searchpattern *`
Редактирование
, Так как это, кажется, довольно популярная мысль вопроса, которую что я обновлю.
В наше время я главным образом использую ack-grep
, поскольку это более удобно для пользователя. Таким образом, вышеупомянутая команда была бы:
perl -p -i -e 's/old/new/g' `ack -l searchpattern`
Для обработки пробела в именах файлов можно работать:
ack --print0 -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
можно сделать больше с ack-grep
. Скажите, что Вы хотите ограничить поиск файлами HTML только:
ack --print0 --html -l searchpattern | xargs -0 perl -p -i -e 's/old/new/g'
И если пробел не является проблемой, это еще короче:
perl -p -i -e 's/old/new/g' `ack -l --html searchpattern`
perl -p -i -e 's/old/new/g' `ack -f --html` # will match all html files
Это, кажется, то, что Вы хотите, на основе примера, который Вы дали:
sed -i 's/foo/bar/g' *
Это не рекурсивно (это не будет убывать в подкаталоги). Для хорошей замены решения в выбранных файлах всюду по дереву я использовал бы, найдите:
find . -name '*.html' -print -exec sed -i.bak 's/foo/bar/g' {} \;
Эти *.html
выражение, которому файлы должны соответствовать, .bak
после того, как эти -i
делает копию исходного файла, с .bak расширением (это может быть любое расширение, которое Вы любите), и g
в конце sed выражения говорит sed заменять несколько копий на одной строке (а не только первая). -print
для нахождения удобство показать, какие файлы подбирались. Все это зависит от точных версий этих инструментов в Вашей системе.
Если Ваш sed(1)
имеет -i
опция, то используйте ее как это:
for i in *; do
sed -i 's/foo/bar/' $i
done
В противном случае существует несколько путей изменения на следующем, в зависимости от которого языка Вы хотите играть с:
ruby -i.bak -pe 'sub(%r{foo}, 'bar')' *
perl -pi.bak -e 's/foo/bar/' *
Мне нравится и я использовал вышеупомянутое решение или общесистемный поиск и замену среди тысяч файлов:
find -name '*.htm?' -print -exec sed -i.bak 's/foo/bar/g' {} \;
Я полагаю, с помощью '* .htm?' вместо .html он ищет и находит как файлы .htm, так и .html.
Я заменяю .bak более общесистемной тильдой (~), чтобы упростить очистку файлов резервных копий.