如何用多个文件中的不同字符串替换模式

时间:2017-12-01 01:55:43

标签: bash shell perl scripting

我正在将java注释添加到多个测试文件中。对于100多个地方的多个文件中的测试方法,我必须这样做。

使用一些脚本/正则表达式,我已经有了注释。剩下的部分是为这些注释提供属性值,例如如下面的情况所示,我需要将value = "search_pattern"替换为value="replace_string1",其中replace_string1是要添加注释的函数的名称(它在注释下面显示几行,请参阅片段供参考)。

每个文件可以有多个功能来应用注释,并且有许多这样的文件。

有没有办法编写脚本?

我还没有找到sed的运气,我也不想手动完成所有这些操作。

@Prop(name = "Operation", value = "search_pattern")
...
@Test
public void replace_string1() {
    ...     
 }

@Prop(name = "Operation", value = "search_pattern")
...
@Test
public void replace_string2() {

}

1 个答案:

答案 0 :(得分:1)

你可以在tac的帮助下完成,它以相反的顺序打印文件,所以我们在最后再次调用它。

tac file | awk '/^public void/ {v=$3; sub(/\(\)/,"",v)}
     /^@Prop\(name = \"Operation\"/ {sub(/search_pattern/,v,$0)} 1' |tac

here您可以看到awk函数sub。最后1表示打印。

因此,例如,如果您想对目录中的所有*.java执行此操作,则可以运行以下内容:

for f in *.java ; do
    tac "$f" | awk '/^public void/ {v=$3; sub(/\(\)/,"",v)}
         /^@Prop\(name = \"Operation\"/ {sub(/search_pattern/,v,$0)}
         1' |tac > temp && mv temp "$f"
done

最后一个mv命令会在没有提示的情况下替换该文件,因此您必须在运行之前进行测试。