Используя только grep и sed, как заменить все вхождения:
a.example.com
с
b.example.com
в текстовом файле в дереве каталогов /home/user/
, рекурсивном поиске и замене всех вхождений во всех файлах в подкаталогах.
Используя только grep и sed, как заменить все вхождения:
a.example.com
с
b.example.com
в текстовом файле в дереве каталогов /home/user/
, рекурсивном поиске и замене всех вхождений во всех файлах в подкаталогах.
Попробуй это:
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'
Изменение: экранированные точки в поисковом выражении
Попробуйте следующее:
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
.
Я знаю, что это действительно старый вопрос, но...
@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
Источники:
У меня работает следующая команда:
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]'
Попробуйте выполнить следующую команду:
/home/user/ directory - find ./ -type f \
-exec sed -i -e 's/a.example.com/b.example.com/g' {} \;
это намного проще, чем это.
for i in 'find *' ; do sed -i -- 's/search string/target string/g' $i;
сделанный
find i
=> введет все файлы в папке и в подпапках в SED.
sed -i
=> заменит в файлах соответствующую строку, если она существует.
Приведенная ниже команда будет искать рекурсивно все файлы, имя которых соответствует шаблону поиска и заменит строку:
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'