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

仅使用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.com/g'

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

我知道这是一个很老的问题,但是

  • @vehomzzz的回答使用了
    find
    xargs
    ,当问题明确表示
    grep
    sed

  • @EmployedRussian和@BrooksMoses试图说这是一个由
    awk
    sed
    组成的dup,但事实并非如此——同样,问题明确地说是
    grep
    sed

  • 下面是我的解决方案,假设您使用Bash作为shell:

    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系统上的工作方式有所不同

    特别是BSD
    sed

    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'