Sed 如何在目录树中递归查找和替换所有出现的字符串?
仅使用grep和sed,如何替换所有出现的:Sed 如何在目录树中递归查找和替换所有出现的字符串?,sed,find,grep,replace,Sed,Find,Grep,Replace,仅使用grep和sed,如何替换所有出现的: a.example.com 与 在/home/user/目录树下的文本文件中,递归查找并替换子目录中所有文件中出现的所有内容。尝试以下操作: find/home/user/-type f|xargs sed-i's/a\.example\.com/b.example.com/g' 如果你想忽略点目录 find\(!-regex'.*/\...*')-键入f | xargs sed-i's/a\.example\.com/b.example.c
a.example.com
与
在/home/user/
目录树下的文本文件中,递归查找并替换子目录中所有文件中出现的所有内容。尝试以下操作:
find/home/user/-type f|xargs sed-i's/a\.example\.com/b.example.com/g'
如果你想忽略点目录
find\(!-regex'.*/\...*')-键入f | xargs sed-i's/a\.example\.com/b.example.com/g'
编辑:搜索表达式中的转义点我知道这是一个很老的问题,但是
find
和xargs
,当问题明确表示grep
和sed
时awk
和sed
组成的dup,但事实并非如此——同样,问题明确地说是grep
和sed
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
如果您使用的是不同的shell,例如unixshell,请告诉我,我将尝试找到语法调整
附言:这是一条单行线:
资料来源:
/home/user/ directory - find ./ -type f \
-exec sed -i -e 's/a.example.com/b.example.com/g' {} \;
试试这个:
grep -rl 'SearchString' ./ | xargs sed -i 's/REPLACESTRING/WITHTHIS/g'
grep-rl
将在目录/
中递归搜索SEARCHSTRING
,并使用sed
替换字符串
例:
在目录cartonnetwork
grep -rl 'SWATKATS' CARTOONNETWORK/ | xargs sed -i 's/TOM/JERRY/g'
这将在
cartonnetwork
下的所有文件和子目录中将TOM
替换为JERRY
,无论它在哪里找到字符串SWATKATS
,下面的命令将递归搜索名称与搜索模式匹配的所有文件,并替换字符串:
find/path/to/searchdir/-name“serachpatter”-键入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'
比这简单得多
for i in `find *` ; do sed -i -- 's/search string/target string/g' $i; done
find i
=>将迭代该文件夹和子文件夹中的所有文件
sed-i
=>将替换文件中的相关字符串(如果存在)。对于我,下一个命令是:
find /path/to/dir -name "file.txt" | xargs sed -i 's/string_to_replace/new_string/g'
如果字符串包含斜杠“path/to/dir”,则可以用另一个要分隔的字符替换它,例如“@”而不是“/”
例如:
's@string/到/replace@new/string@g“
在macOS上,没有一个答案对我有用。我发现这是因为与GNU相比,sed
在macOS和其他BSD系统上的工作方式有所不同
特别是BSDsed
grep
version from
从中查找版本
如果您在Git repo中,请不要忽略Regex以忽略
文件夹。我意识到这很难
该LC_ALL=C
选项为。这是BSD和GNU之间的另一个区别。根据您处理的文件类型,您可能不需要它
由于一些我不清楚的原因,grep
版本比find
版本发现的次数更多,这就是为什么我建议使用grep
我们可以尝试使用更强大的ripgrep作为
rg“BYE_-BYE_-TEXT”。/--带有匹配项的文件| xargs sed-i“s/BYE_-BYE_-TEXT/WELCOME_-TEXT/g”
因为ripgrep擅长查找,sed擅长替换。这会替换/home/user目录下每个文件中的字符串吗?包括子目录?是的,会的,不过你应该在查找后指定某种模式-命名为“pattern”?什么是“某种模式”?类似于-命名为“pattern”
-其中“pattern”可能类似于“domainlist*”-缩小搜索范围。根据,最好分别在find
和xargs
命令上使用-print0
和-0
。您好。请不要把代码当作答案。解释您正在做什么,以便用户能够理解如何解决问题。Cheers.find/path/to/searchdir/-name“serachpatter”-键入f-maxdepth 4-mindepth 2 | xargs sed-i's/stringone/StrIngTwo/g'以后,请编辑您的答案,而不是在下面发表评论。另外,请适当设置代码格式;不要在代码中使用粗体格式的文本。谢谢您的回答,以及如何将其写入其他文件以避免出错?Sed支持使用在URL中不常见的替代字符分隔符,如%
,因此您不必转义所有斜杠。@dragon788我不知道,但我没有转义正斜杠。我在逃避经期。句点对于任何字符来说都是正则表达式的特殊字符,因此必须对其进行转义以专门匹配域名中的句点。
for i in `find *` ; do sed -i -- 's/search string/target string/g' $i; done
find /path/to/dir -name "file.txt" | xargs sed -i 's/string_to_replace/new_string/g'
grep -rl 'foo' ./ | LC_ALL=C xargs sed -i '' 's/foo/bar/g'
find . \( ! -regex '.*/\..*' \) -type f | LC_ALL=C xargs sed -i '' 's/foo/bar/g'