Найти и заменить определенный термин в нескольких файлах

Как я могу заменить определенный термин в нескольких файлах в Linux?

Например, у меня есть несколько файлов в моем каталоге:

файл1.txt файл2.txt файл3.txt

И мне нужно найти слово «поисковое слово» и заменить его на «заменить слово».


person Legend    schedule 15.02.2010    source источник


Ответы (5)


sed -i.bak 's/searchword/replaceword/g' file*.txt
# Or sed -i.bak '/searchword/s/searchword/replaceword/g' file*.txt

В bash 4.0 вы можете выполнять рекурсивный поиск файлов

#!/bin/bash
shopt -s globstar
for file in **/file*.txt
do 
  sed -i.bak 's/searchword/replaceword/g' $file
  # or sed -i.bak '/searchword/s/searchword/replaceword/g' $file
done

Или с помощью GNU найти

find /path -type f -iname "file*.txt" -exec sed -i.bak 's/searchword/replace/g' "{}" +;
person ghostdog74    schedule 15.02.2010
comment
Второй вариант можно сократить до sed -i.bak '/searchword/s//replaceword/g' - person William Pursell; 15.02.2010
comment
второй вариант обхода подкаталогов. - person ghostdog74; 15.02.2010
comment
@ghostdog: Вы упускаете смысл моего комментария. С sed вам не нужно дважды указывать слово для поиска. - person William Pursell; 17.02.2010

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

grep -lr -e '<searchthis>' * | xargs sed -i 's/<searchthis>/<replacewith>/g'
person Legend    schedule 15.02.2010
comment
Вы также можете просто сделать sed 's<searchthis>/<replacewith>/g' -i * - person JAL; 15.02.2010
comment
А... еще проще.. :) Спасибо! - person Legend; 15.02.2010
comment
@Code Duck - это позволит избежать вызова sed там, где нет поискового запроса. Думаю, более эффективно, когда файлы большие. - person Tom Duckering; 15.02.2010
comment
@ Том Дакеринг: Я тоже об этом думал, но потом понял, что первый пример тоже просматривает каждый файл в каталоге, чтобы найти термин. Sed может быть или не быть таким же эффективным, как grep, но в любом случае проще использовать одну команду. - person JAL; 15.02.2010
comment
@Code Duck - да - обычная сделка, которую делают, добавляя сложности, чтобы сделать что-то более эффективным. :) - person Tom Duckering; 15.02.2010
comment
Неясно, является ли поиск по файлам с помощью grep более эффективным, чем поиск по файлам с помощью sed. В любом случае, каждая строка каждого файла просеивается. - person JAL; 15.02.2010
comment
@ Том Дакеринг: На самом деле, grep/xargs/sed менее эффективен: вы открываете каждый файл, ищете его, а затем повторно открываете соответствующие файлы с помощью sed. В стиле sed only вы просто открываете каждый файл. Итак, это как O(n+x) против O(n). - person JAL; 15.02.2010

Используйте сценарий редактирования

Хотя у sed теперь есть опция редактирования на месте, вы также можете использовать для этой цели программу ed или ex...

for i in "$@"; do ed "$i" << \eof; done
1,$s/searchword/replaceword/g
w
q
eof
person DigitalRoss    schedule 15.02.2010

Этот ruby-скрипт сработал для меня, а также переименовывает файлы/папки с этой опечаткой.

person Lee Woodman    schedule 07.03.2014

Попробуйте mffr, если вы находитесь в репозитории git.

pip install mffr
mffr searchword replaceword
person Quanlong    schedule 16.09.2014