如何使用sed regex在特定单词之前添加新单词

时间:2018-06-25 03:05:09

标签: regex sed

我的原始文件如下:

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.

2 个答案:

答案 0 :(得分:0)

您可以使用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

答案 1 :(得分:0)

能否请您尝试以下操作,如果有帮助,请告诉我。

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

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