如何根据模式匹配从文件中匹配和删除一些if语句

时间:2018-01-30 17:45:35

标签: shell perl awk sed grep

我有以下代码

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) 我怎么能这样做?

2 个答案:

答案 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

这将删除两个}之间的其他文本和模式。