Подтвердить что ты не робот

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

Используя только grep и sed, как заменить все вхождения:

a.example.com

с

b.example.com

в текстовом файле в дереве каталогов /home/user/, рекурсивном поиске и замене всех вхождений во всех файлах в подкаталогах.

4b9b3361

Ответ 1

Попробуй это:

find /home/user/ -type f | xargs sed -i  's/a\.example\.com/b.example.com/g'

Если вы хотите игнорировать точечные каталоги

find . \( ! -regex '.*/\..*' \) -type f | xargs sed -i 's/a\.example\.com/b.example.com/g'

Изменение: экранированные точки в поисковом выражении

Ответ 2

Попробуйте следующее:

grep -rl 'SearchString' ./ | xargs sed -i 's/REPLACESTRING/WITHTHIS/g'

grep -rl будет рекурсивно искать SEARCHSTRING в каталогах ./ и будет заменять строки с помощью sed.

Пример:

Замена имени TOM на JERRY с помощью строки поиска SWATKATS в каталоге CARTOONNETWORK

grep -rl 'SWATKATS' CARTOONNETWORK/ | xargs sed -i 's/TOM/JERRY/g'

Это заменит TOM на JERRY во всех файлах и подкаталогах под CARTOONNETWORK везде, где он найдет строку SWATKATS.

Ответ 3

Я знаю, что это действительно старый вопрос, но...

  • Ответ
  • @vehomzzz использует find и xargs, когда вопросы явно указывают только grep и sed.

  • @EmployedRussian и @BrooksMoses пытались сказать, что это был dup awk и sed, но это не так, вопрос явно говорит только grep и sed.

Итак, вот мое решение, предполагая, что вы используете Bash в качестве оболочки:

OLDIFS=$IFS
IFS=$'\n'
for f in `grep -rl a.example.com .` # Use -irl instead of -rl for case insensitive search
do
    sed -i 's/a\.example\.com/b.example.com/g' $f # Use /gi instead of /g for case insensitive search
done
IFS=$OLDIFS

Если вы используете другую оболочку, такую ​​как Unix SHell, дайте мне знать, и я попытаюсь найти настройку синтаксиса.

P.S.: Здесь однострочный:

OLDIFS=$IFS;IFS=$'\n';for f in `grep -rl a.example.com .`;do sed -i 's/a\.example\.com/b.example.com/g' $f;done;IFS=$OLDIFS

Источники:

Ответ 4

У меня работает следующая команда:

find /path/to/dir -name "file.txt" | xargs sed -i 's/string_to_replace/new_string/g'

если строка содержит косую черту 'path/to/dir', ее можно заменить другим символом для разделения, например '@' вместо '/'.

Например: '[email protected]/to/[email protected]/[email protected]'

Ответ 5

Попробуйте выполнить следующую команду:

/home/user/ directory - find ./ -type f \
-exec sed -i -e 's/a.example.com/b.example.com/g' {} \;

Ответ 6

это намного проще, чем это.

for i in 'find *' ; do sed -i -- 's/search string/target string/g' $i;

сделанный

find i => введет все файлы в папке и в подпапках в SED.

sed -i => заменит в файлах соответствующую строку, если она существует.

Ответ 7

Приведенная ниже команда будет искать рекурсивно все файлы, имя которых соответствует шаблону поиска и заменит строку:

find /path/to/searchdir/ -name "serachpatter" -type f | xargs sed -i 's/stringone/StrIngTwo/g'

Также, если вы хотите ограничить глубину рекурсии, вы можете также установить пределы:

find /path/to/searchdir/ -name "serachpatter" -type f -maxdepth 4 -mindepth 2 | xargs sed -i 's/stringone/StrIngTwo/g'