Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何基于模式匹配从文件中匹配和删除一些if语句_Shell_Perl_Awk_Sed_Grep - Fatal编程技术网

Shell 如何基于模式匹配从文件中匹配和删除一些if语句

Shell 如何基于模式匹配从文件中匹配和删除一些if语句,shell,perl,awk,sed,grep,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 (temp==1) { some text } if (temp==1) { some text } 现在我需要从文件中删除匹配的行。 因此,必须保留所有if(temp2==1),并且必须删除if(temp2==1)。 如何实现这一点?如果没有

我有以下代码

if (temp==1) { some text } some more text abcdef if (temp==1) { some text } if (temp2==1) { some text } 我得到以下输出

if (temp==1) { some text } if (temp==1) { some text } 现在我需要从文件中删除匹配的行。
因此,必须保留所有
if(temp2==1)
,并且必须删除
if(temp2==1)


如何实现这一点?

如果没有编写代码所用的任何语言的解析器,一般来说,您所要求的是不可能实现的,但是您可以在任何UNIX设备上的任何操作系统中使用任何awk从特定输入中生成所需的输出:

awk '/if \(temp==1/{f=1} !f; /}/{f=0}' file

如果这就是您想要的。

如果没有编写代码所用的任何语言的解析器,您要求做的事情通常是不可能的,但是您可以在任何UNIX设备上的任何操作系统中使用任何awk从特定输入中生成您想要的输出:

awk '/if \(temp==1/{f=1} !f; /}/{f=0}' file

如果这就是您想要的。

您可能可以使用
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

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

您可能可以使用
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


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

不适用于perl正则表达式(Po)。您说需要删除所有if语句,但预期的输出包括if语句。请澄清你的问题。情况不同。如果(temp2==1)必须保留,如果(temp2==1)必须删除,请再次编辑问题。我只是困惑地通读了一遍,终于在一篇评论中看到了。把问题编辑得更清楚一些。希望helpsdoesn不能与perl regex(Po)一起使用。如果您说需要删除所有if语句,那么您的预期输出将包括一个if语句。请澄清你的问题。情况不同。如果(temp2==1)必须保留,如果(temp2==1)必须删除,请再次编辑问题。我只是困惑地通读了一遍,终于在一篇评论中看到了。把问题编辑得更清楚一些。希望这对我有帮助!!很有魅力。。只是进一步检查。。一旦我的检查完成,我会将此标记为正确答案。如果有嵌套的大括号,它将失败。例如,如果(temp==1){something if(temp3==1){something other}}@blganesh101,你的例子就在你的问题中,不要要求人们成为“尤达”,并且凭空知道你的输入。正如我所说的“如果没有任何语言的解析器来编写代码,你所要求的通常是不可能的,但是你可以从特定的输入中产生你想要的输出。。。“-如果您的实际输入与您提供的示例不符,那么脚本当然不会对其进行解析。那么,您只是在浪费大家的时间来回答所写的问题,因为您正在询问如何解析文本,而没有向我们展示该文本的真正代表性示例。太棒了!!很有魅力。。只是进一步检查。。一旦我的检查完成,我会将此标记为正确答案。如果有嵌套的大括号,它将失败。例如,如果(temp==1){something if(temp3==1){something other}}@blganesh101,你的例子就在你的问题中,不要要求人们成为“尤达”,并且凭空知道你的输入。正如我所说的“如果没有任何语言的解析器来编写代码,你所要求的通常是不可能的,但是你可以从特定的输入中产生你想要的输出。。。“-如果您的实际输入与您提供的示例不符,那么脚本当然不会对其进行解析。那么,您只是在浪费大家的时间来回答所写的问题,因为您正在询问如何解析文本,而不向我们展示该文本的真正代表性示例。如果存在嵌套大括号,则会失败。例如,如果(temp==1){something if(temp3==1){something other}}总是会有这种模式的边缘案例,没有人会完全证明。这就是我的结果。它不起作用。它删除第一次匹配后的所有行。如果存在嵌套大括号,则会失败。例如,如果(temp==1){something if(temp3==1){something other}}总是会有这种模式的边缘案例,没有人会完全证明。这就是我的结果。它不起作用。它删除第一次匹配后的所有行