sed-如何在目录树中递归查找和替换所有出现的字符串?

仅使用grep和sed,如何替换所有出现的情况:

a.example.com

b.example.com

/home/user/目录树下的文本文件中,也以递归方式查找并替换子目录中所有文件中的所有匹配项。

Tony asked 2020-06-23T06:55:12Z
7个解决方案
75 votes

试试这个:

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'

编辑:搜索表达式中的转义点

vehomzzz answered 2020-06-23T06:55:33Z
28 votes

试试这个:

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

TOM将在目录CARTOONNETWORK中递归搜索JERRY,并将使用SWATKATS替换字符串。

例如:

在目录SWATKATS中使用搜索字符串作为2935302263662969969858将名称TOM替换为JERRY

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

这将在所有文件和子目录与JERRY取代TOMCARTOONNETWORK下的地方找到字符串SWATKATS

Abhinav Deshpande answered 2020-06-23T06:56:11Z
4 votes

我知道这是一个非常老的问题,但是...

  1. 当问题仅明确指出grepsed时,@ vehomzzz的答案使用awksed

  2. @EmployedRussian和@BrooksMoses试图说这是awksed的重复,但事实并非如此-问题再次明确指出仅grep和2935302901213955955。

所以这是我的解决方案,假设您使用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),请告诉我,我将尝试查找语法调整。

附注:这是单线的:

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

资料来源:

  • Bash:遍历变量中的行

  • grep(1)-Linux手册页

  • 官方Grep手册

  • 但是(1)-Linux手册页

  • 官方sed手册

Timberwolf answered 2020-06-23T06:57:19Z
2 votes

对我来说,下一条命令是:

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

如果字符串包含斜杠“ path / to / dir”,则可以将其替换为另一个字符以分隔,例如“ @”而不是“ /”。

例如:'s@string/to/replace@new/string@g'

Yahor M answered 2020-06-23T06:57:48Z
1 votes

试试这个命令:

/home/user/ directory - find ./ -type f \
-exec sed -i -e 's/a.example.com/b.example.com/g' {} \;
Navneet answered 2020-06-23T06:58:08Z
1 votes

比这简单得多。

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

完成

sed -i =>将把文件夹和子文件夹中的所有文件引入SED。

sed -i =>将在文件中替换相关的字符串(如果存在)。

gilad 1 answered 2020-06-23T06:58:41Z
0 votes

下面的命令将以递归方式搜索名称与搜索模式匹配的所有文件,并将替换字符串:

find /path/to/searchdir/ -name "serachpatter" -type f -maxdepth 4 -mindepth 2 | 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'

akprajapati answered 2020-06-23T06:59:15Z
translate from https://stackoverflow.com:/questions/1585170/how-to-find-and-replace-all-occurrences-of-a-string-recursively-in-a-directory-t