【问题标题】:How to replace string in files recursively via sed or awk?如何通过 sed 或 awk 递归替换文件中的字符串?
【发布时间】:2017-08-25 02:38:08
【问题描述】:

我想知道如何从命令行搜索 .rb 类型的各种文件中的字符串。

并且替换

.delay([ANY OPTIONAL TEXT FOR DELETION]).

.delay.

除了 sed 和 awk 之外,操作系统中是否还有其他更适合该任务的命令行工具?

状态

到目前为止,我有以下正则表达式:

.delay\(*.*\)\.

我想知道如何只匹配以第一个右括号结尾的表达式?并避免更换:

.delay([ANY OPTIONAL TEXT FOR DELETION]).sometext(param)

提前致谢!

【问题讨论】:

    标签: linux macos awk sed


    【解决方案1】:

    对于您只想匹配和替换直到第一个 ) 而不包括第二对 () 的问题部分,这里是如何更改您的正则表达式:

    .delay\(*.*\)\.
    

    ->

    \.delay\([^\)]*\)
    

    即匹配“实际点,延迟,大括号打开,除了大括号关闭和大括号关闭之外的所有内容”。

    例如使用 sed:

    >echo .delay([ANY OPTIONAL TEXT FOR DELETION]).sometext(param) | sed -E "s/\.delay\([^\)]*\)/.delay/"  
    

    .delay.sometext(param)

    我建议使用 grep 来查找正确的文件:

    grep -rl --include "*.rb" '\.delay' .
    

    然后按照其他答案的建议将列表输入 xargs。

    感谢其他答案提供了将多个文件输入 sed 的解决方案。

    【讨论】:

      【解决方案2】:

      您可以使用find 生成文件列表,并使用xargs 对结果运行sed

      find . -type f -print | xargs sed -i 's/\.delay.*/.delay./'
      

      find 将生成包含在您当前目录中的文件列表(.,尽管您当然可以传递不同的目录),xargs 将读取该列表,然后运行 ​​sed 与列表文件作为参数。

      您可以使用grep 之类的东西来生成包含特定术语的文件列表,而不是find,它会在此处生成所有 文件的列表。例如:

      grep -rl '\.delay' | xargs sed -i ...
      

      【讨论】:

        【解决方案3】:

        如果您需要查找和替换文件中的文本 - sed 似乎是最好的命令行解决方案。

        在文本文件中搜索字符串并替换:

        sed -i 's/PATTERN/REPLACEMENT/' file.name
        

        或者,如果需要处理文件中PATTERN的多次出现,添加g

        sed -i 's/PATTERN/REPLACEMENT/g' file.name
        

        对于多个文件处理 - 将文件列表重定向到 sed:

        echo "${filesList}" | xargs sed -i ...
        

        【讨论】:

        • 将这样的文件列表重定向到 sed 只会让 sed 对该列表进行操作,而不是文件本身。试试echo hello | sed s/hello/goodbye/
        • 感谢您解决这个问题。
        猜你喜欢
        • 2010-12-07
        • 2020-02-18
        • 2015-05-10
        • 1970-01-01
        • 2016-02-01
        • 1970-01-01
        相关资源
        最近更新 更多