【问题标题】:Unix find and replace recursively?Unix递归查找和替换?
【发布时间】:2012-04-28 08:28:42
【问题描述】:

希望这对这里的某人来说是一个快速的...我需要在 unix 中递归地查找和替换字符串。

通常,我使用:

perl -e "s/term/differenterm/g;" -pi $(find path/to/DIRECTORY -type f)

但是,我需要替换的字符串包含斜杠,我不知道如何转义它们?

所以,我需要这样做:

perl -e "s/FIND/REPLACE/g;" -pi $(find path/to/DIRECTORY -type f)

其中 FIND = '/string/path/term' 和 REPLACE = '/string/path/newterm'

【问题讨论】:

    标签: unix replace find


    【解决方案1】:

    在 unix 中是这样的:

    find "$path" -type f -print0|xargs -0 \
        perl -p -i -e "s/term/differenterm/g;"
    

    这利用findxargs 来查找子树中的所有文件并将它们传递给perl 进行处理。

    注意,如果您想在您的正则表达式中使用 /,您可以使用 \ 转义它们:

        perl -p -i -e "s/\/source\/path/\/dest\/path/g;"
    

    或为正则表达式本身使用不同于/ 的分隔符:

        perl -p -i -e "s|/source/path|/dest/path|g;"
    

    另请注意,还有其他方法可以递归地在子树上运行程序,但它们并不能正确处理带有空格或其他特殊字符的文件名。

    【讨论】:

    • @user1154488 说 termdifferentterm 包含斜杠,因此您的解决方案无法解决他的问题。
    【解决方案2】:

    您可以使用除/ 之外的其他字符。例如:

    perl -e "s|FIND|REPLACE|g;" -pi $(find path/to/DIRECTORY -type f)
    

    更多信息http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators

    【讨论】:

      猜你喜欢
      • 2012-12-26
      • 2011-10-23
      • 2023-03-25
      • 2013-05-26
      • 2016-08-21
      • 2012-01-11
      • 2016-03-18
      • 1970-01-01
      • 2023-03-13
      相关资源
      最近更新 更多