Расширенный поиск и замена командной строки Linux

79
задан syb0rg 15 July 2014 в 01:32
поделиться

4 ответа

Вы имеете в виду поиск и заменяете строку во всех файлах, подобранных 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
70
ответ дан armandino 24 November 2019 в 10:06
поделиться

Это, кажется, то, что Вы хотите, на основе примера, который Вы дали:

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 для нахождения удобство показать, какие файлы подбирались. Все это зависит от точных версий этих инструментов в Вашей системе.

108
ответ дан greduan 24 November 2019 в 10:06
поделиться

Если Ваш 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/' *
13
ответ дан Keltia 24 November 2019 в 10:06
поделиться

Мне нравится и я использовал вышеупомянутое решение или общесистемный поиск и замену среди тысяч файлов:

find -name '*.htm?' -print -exec sed -i.bak 's/foo/bar/g' {} \;

Я полагаю, с помощью '* .htm?' вместо .html он ищет и находит как файлы .htm, так и .html.

Я заменяю .bak более общесистемной тильдой (~), чтобы упростить очистку файлов резервных копий.

6
ответ дан 24 November 2019 в 10:06
поделиться
Другие вопросы по тегам:

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