【问题标题】:How to match and delete some if statements from a file based on pattern matching如何根据模式匹配从文件中匹配和删除一些 if 语句
【发布时间】:2018-07-09 16:44:03
【问题描述】:

我有以下代码

如果(温度==1){ 一些文字 } 还有一些文字 abcdef 如果(温度==1){ 一些文字 } 如果 (temp2==1) { 一些文字 }

我需要使用任何脚本/命令来删除所有 if 语句。

需要的输出:

还有一些文字 abcdef 如果 (temp2==1) { 一些文字 }

我已经可以实现的是以下

grep -zPo "if\ \(temp==1\) (\{([^{}]++)*\})" filename

我得到以下输出

如果(温度==1){ 一些文字 } 如果(温度==1){ 一些文字 }

perl 命令的结果也一样

perl -l -0777 -ne  
    "print $& while /if \(temp==1\) (\{([^{}]++|(?1))*\})/g" filename

现在我需要从文件中删除匹配的行。
所以必须保留所有if(temp2==1),必须删除if(temp==1)
我该怎么做?

【问题讨论】:

  • 不适用于 perl 正则表达式 (Po)
  • 您说您需要删除所有 if 语句,但您的预期输出包含一个 if 语句。请edit澄清您的问题。
  • 条件不同。 if (temp2==1) 必须保留,if (temp==1) 必须删除
  • 再一次:请编辑问题。我刚刚通读了所有内容,感到困惑,终于在评论中看到了。
  • 将问题编辑得更清楚。希望有帮助

标签: shell perl awk sed grep


【解决方案1】:

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

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

如果这就是你想要的。

【讨论】:

  • 太棒了!就像一个魅力..只是进一步检查..一旦我的检查完成,我会将其标记为正确答案。
  • 当有嵌套的大括号时它会失败。例如 if (temp==1) { something if (temp3==1) { something else } }
  • @blganesh101 你的例子就在你的问题中,不要要求人们成为“尤达”并且凭空知道你的输入。
  • 正如我所说的“如果没有针对编写代码的任何语言的解析器,您要求做的事情通常是不可能的,但您可以从该特定输入生成您想要的输出......” - 如果您的实际输入看起来不像您提供的示例,那么脚本当然不会解析它。
  • 那么你只是在浪费每个人的时间来写这个问题,因为你问的是如何解析文本而没有向我们展示该文本的真正代表性示例。
【解决方案2】:

您可能可以使用sed 来执行此操作:

$ sed '/temp==1/,/}/d' inputfile
some more text 
abcdef
if (temp2==1) {
some text 
}

Above 删除(使用d)在模式/temp==1} 之间(包括模式)之间的所有行。

注意:它不适用于嵌套模式,因为 OP 在他的评论中建议。根据 OP 的评论,可以执行以下操作:

$ sed '/temp==1/,/}/d;/}/,/}/d' 1.txt

这会删除两个}s 之间的额外文本和模式。

【讨论】:

  • 当有嵌套的大括号时它会失败。例如 if (temp==1) { something if (temp3==1) { something else } }
  • 总会有这种模式的边缘情况,没有人会完全证明。
  • 只是我的结果。这是行不通的。它会删除第一次匹配后的所有行
猜你喜欢
  • 2014-07-18
  • 2020-04-06
  • 2019-11-05
  • 1970-01-01
  • 2016-02-29
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
相关资源
最近更新 更多