我试图注释掉某些C文件中的所有_asm(有时是__asm)时钟。例如
_asm {
bla
bla
}
成为
//## _asm {
//## bla
//## bla
//## }
和
__asm { bla bla }
成为
//## __asm { bla bla }
此外,有时还会有_asm行没有大括号
_asm bla bla
那应该变成
//## _asm bla bla
我怀疑是否可以使用单个sed或awk表达式来完成此操作,这没关系。我只需要能够以完全相同的方式注释掉这些块,以便可以通过从文件中删除所有“ // ##”模式来撤消所有操作。
谢谢。
答案 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
开始的行。插入注释字符,如果该行不包含大括号或大括号或大括号,那么我们就完成了。否则,打印当前行并读入下一行。注释此行,然后重复直到找到右括号为止。