我有一些代码生成器的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和其他东西的组合也会很好。
答案 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)
将tac
与awk
一起使用:
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();
...
}