在两个模式(包括两个模式)之间的每一行的开头插入文本

时间:2018-10-18 14:39:17

标签: regex perl awk sed

我试图注释掉某些C文件中的所有_asm(有时是__asm)时钟。例如

_asm {
bla
bla
}

成为

//## _asm {
//## bla
//## bla
//## }

__asm { bla bla }

成为

//## __asm { bla bla }

此外,有时还会有_asm行没有大括号

_asm bla bla

那应该变成

//## _asm bla bla

我怀疑是否可以使用单个sed或awk表达式来完成此操作,这没关系。我只需要能够以完全相同的方式注释掉这些块,以便可以通过从文件中删除所有“ // ##”模式来撤消所有操作。

谢谢。

2 个答案:

答案 0 :(得分:1)

将其用作测试文件:

It works
elanblkaneglka
_asm {
bla
bla
}
bjkzrbgjkzbjkerzeg
zjegbzkjebzkjg{
   blabla
}
__asm { bla bla }
_asm bla bla
bajekbajkegbakeg
Next lines should not work
_asm
{blabla}
_asm {
bla{
  bla
}
bla
}

我尝试过:

awk '/_+asm *\{/{bracket=1}/_+asm/{comment=1}comment{print "//##", $0}!comment;!bracket||/\}/{comment=0;bracket=0}' test.txt

这当然很丑陋,但正则表达式不适用于此类问题。

  • 如果__asm {}块内还有其他括号,则不起作用。

  • 如果{和__asm不在同一行,则不起作用。

结果:

It works
elanblkaneglka
//## _asm {
//## bla
//## bla
//## }
bjkzrbgjkzbjkerzeg
zjegbzkjebzkjg{
   blabla
}
//## __asm { bla bla }
//## _asm bla bla
bajekbajkegbakeg
Next lines should not work
//## _asm
{blabla}
//## _asm {
//## bla{
//##   bla
//## }
bla
}

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed '/^_\+asm/!b;s@^@//## @;/{/!b;/{.*}/b;:a;n;s@^@//## @;/}/!ba' file

关注从_asm开始的行。插入注释字符,如果该行不包含大括号或大括号或大括号,那么我们就完成了。否则,打印当前行并读入下一行。注释此行,然后重复直到找到右括号为止。