我有以下代码
if (temp==1) { some text } some more text abcdef if (temp==1) { some text } if (temp2==1) { some text }
我需要使用任何脚本/命令来删除所有if语句。
必需的输出:
some more text abcdef if (temp2==1) { some text }
我已经可以实现以下
grep -zPo "if\ \(temp==1\) (\{([^{}]++)*\})" filename
我得到以下输出
if (temp==1) { some text } if (temp==1) { some text }
同样来自perl命令的结果
perl -l -0777 -ne
"print $& while /if \(temp==1\) (\{([^{}]++|(?1))*\})/g" filename
现在我需要从文件中删除匹配的行
因此,必须保留所有if(temp2==1)
,并且必须删除if(temp==1)
我怎么能这样做?
答案 0 :(得分:3)
一般情况下,如果没有解析器编写任何语言的解析器,你一般不可能要做的事情,但你可以使用任何UNIX上的任何操作系统中的任何awk从该特定输入生成所需的输出:
awk '/if \(temp==1/{f=1} !f; /}/{f=0}' file
如果你想要的话。
答案 1 :(得分:1)
您可以使用sed
执行此操作:
$ sed '/temp==1/,/}/d' inputfile
some more text
abcdef
if (temp2==1) {
some text
}
上面删除(d
)模式之间的所有行,/temp==1
和}
。
注意:它不适用于OP在他的评论中建议的嵌套模式。根据OP的评论,可以做以下事情:
$ sed '/temp==1/,/}/d;/}/,/}/d' 1.txt
这将删除两个}
之间的其他文本和模式。