如何用awk或sed进行递归查找/替换字符串?

我如何查找和替换以下所有情况:

subdomainA.example.com

subdomainB.example.com

/home/www/目录树下的每个文本文件中递归地?


注意 :不要在包含git repo的文件夹上运行此命令 - 更改为.git可能会损坏您的git索引。

find /home/www -type f -print0 | xargs -0 sed -i 's/subdomainA.example.com/subdomainB.example.com/g'

man find

-print0 (GNU find only)告诉find使用空字符( 0)而不是空格作为找到的路径名之间的输出分隔符。 如果您的文件可以包含空格或其他特殊字符,则这是一个更安全的选项。 建议使用-print0参数来查找是否使用-exec命令或xargs(在xargs中需要-0参数)。


注意 :不要在包含git repo的文件夹上运行此命令 - 更改为.git可能会损坏您的git索引。

find /home/www/ -type f -exec 
    sed -i 's/subdomainA.example.com/subdomainB.example.com/g' {} +

与其他答案相比,这比大多数简单,并且使用sed而不是perl,这是原始问题所要求的。


所有的技巧都差不多,但我喜欢这个:

find <mydir> -type f -exec sed -i 's/<string1>/<string2>/g' {} +
  • find <mydir> :在目录中查找。

  • -type f

    文件的类型是:常规文件

  • -exec command {} +

    -exec操作的这种变体在选定的文件上运行指定的命令,但命令行是通过在最后附加每个选定的文件名来构建的; 该命令的总调用次数将远远少于匹配文件的数量。 命令行的构建方式与xargs构建其命令行的方式大致相同。 命令中只允许有一个“{}”实例。 该命令在起始目录中执行。

  • 链接地址: http://www.djcxy.com/p/47127.html

    上一篇: How to do a recursive find/replace of a string with awk or sed?

    下一篇: How can I replace a newline (\n) using sed?