在Pattern上方插入文本2行

时间:2016-10-05 12:19:22

标签: shell unix sed

我有一些代码生成器的C代码,必须在代码中的特定标记之前插入两行代码。

示例,生成的代码:@NgModule({ imports: [ SharedModule, routing], declarations: [ HomeComponent], bootstrap: [ HomeComponent ], providers: [ ] })

file.c

我不知道void foo () { bar(); } # <- I want a line to be added here! void example () { MARKERFUNCTION(); ... } 的确切位置,但它只出现在文件中一次,并且是MARKERFUNCTION()中的第一行。 example()不是固定名称。

单个sed命令会很棒,但grep和其他东西的组合也会很好。

2 个答案:

答案 0 :(得分:2)

$ sed '/()\s*{/{N; s/.*MARKERFUNCTION/== Text to add ==\n\0/}' file.c 
void foo () {
  bar();
}

== Text to add ==
void example () {
  MARKERFUNCTION();
  ...
}
  • /()\s*{/匹配()后跟任意空格{ - 检测具有函数的行..如果()内有内容,请使用/)\s*{/可以工作
  • {N;如果上述条件匹配,请获取下一行
  • s/.*MARKERFUNCTION/== Text to add ==\n\0/通过检查我们拥有的两行中是否存在模式MARKERFUNCTION来执行替换。然后在替换部分中,添加所需的文本,换行符和匹配的模式,默认情况下为\0


awk解决方案,假设在具有所需模式的函数启动之前有一个空行

$ awk -v RS= -v ORS="\n\n" '/MARKERFUNCTION/{$0 = "--Text to add--\n" $0} 1' file.c
void foo () {
  bar();
}

--Text to add--
void example () {
  MARKERFUNCTION();
  ...
}

这将逐段读取输入文件,如果段落包含所需的模式,则在打印前添加一行

答案 1 :(得分:2)

tacawk一起使用:

tac file.c | awk '/MARKERFUNCTION/{p=NR} p && NR==p+2{print "new line added"} 1' | tac

void foo () {
  bar();
}

# <- I want a line to be added here!
new line added
void example () {
  MARKERFUNCTION();
  ...
}
相关问题