【问题标题】:how to add a new word before specific word with sed regex如何使用 sed 正则表达式在特定单词之前添加一个新单词
【发布时间】:2018-12-03 13:50:08
【问题描述】:

我的原始文件如下:

import a.b.c.io.AA
import a.b.c.util.io.anc;

我想在特定单词 io 之前添加 util ,它之前的单词不是 util

这是我预期的输出文件:

import a.b.c.io.AA
import a.b.c.util.io.anc;

我试试这个脚本:

find . -name "a.java"|xargs sed -ie 's/import.*[^u][^t][^i][^l].io.*/import.*.util.io*/' but dont get what I want.

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    您能否尝试关注一下,如果这对您有帮助,请告诉我。

    awk '/io/ && !/util\.io/{sub(/io/,".util.&");} 1'  Input_file
    

    如果您想将输出保存到 Input_file 本身,那么也将> temp_file && mv temp_file Input_file 附加到上面的代码中。

    【讨论】:

      【解决方案2】:

      您可以使用b 命令模拟简单的 if-else 条件

      $ sed -e '/util\.io/b' -e 's/\.io/.util&/' ip.txt
      import a.b.c.util.io.AA
      import a.b.c.util.io.anc;
      
      • b 是跳转到给定标签的分支指令 - 如果没有给出标签,它会跳过 sed 脚本的其余部分并开始下一个循环
      • /util\.io/b 如果该行包含util.io,则开始下一个循环
      • s/\.io/.util&/ 其余的行,做这个替换
        • 使用/^import/ s/\.io/.util&/ 仅替换以import 开头的行


      此外,您可以将-execfind 一起使用,而不是xargs - 这就是构建该命令的目的,以对找到的文件采取行动

      find . -name '*.java' -exec sed -i <...> {} +
      

      某些版本可能不支持{} +,在这种情况下请改用{} \;。另见Understanding the -exec option of find

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-18
        • 1970-01-01
        • 2017-03-29
        • 2019-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多