用sed替换四行

时间:2015-09-07 18:21:13

标签: sed

我在更大的文件中有以下代码

   }
   catch (PDOException $e){
        echo 'Error: '. $e->getMessage();
   }

我试图使用sed从文件中删除这四行,但似乎无法搞清楚。每行可以具有前面或尾随的空格。

以下我认为应该有效:

sed '1N;$!N;s/.*}.*\n.*catch.*\n.*Error.*\n.*}.*//;P;D' myfile.php

奇怪的是

sed '1N;$!N;s/.*}.*\n.*catch.*\n.*Error.*//;P;D' myfile.php

删除前三行。和

sed '1N;$!N;s/.*catch.*\n.*Error.*\n.*}.*//;P;D' myfile.php

删除最后三行。

为什么它不适用于所有四条线?

我也不完全理解为什么我需要$!N来实现这一点,所以如果你能解释一下究竟是做什么的,那也将有助于我的理解。

谢谢!

2 个答案:

答案 0 :(得分:1)

这可能适合你(GNU sed):

sed ':a;N;s/\n/&/3;Ta;/^\s*}\n.*catch.*\n.*Error.*\n\s*}$/d;P;D' file

该解决方案在图案空间(PS)中形成四行的移动窗口,并且如果期望的图案与PS匹配,则删除这四行。否则,第一行打印然后删除,另一行附加到PS并再次尝试匹配,直到匹配或文件结束。

N.B。 sed by design在填充PS之前删除任何换行符。 N命令后跟新行后跟PS的下一行。如果在文件结束后调用N命令,则不执行其他命令并打印PS(除非{ {1}}选项正在运行中。

答案 1 :(得分:0)

正如我所说here,如果删除catch块,您将在PHP中遇到语法错误。

顺便说一句,您可以使用php执行该任务。 PHP支持递归正则表达式模式,可以在这里使用:

<?php

$string = <<<'EOF'
   }   
   catch (PDOException $e){
        echo 'Error: '. $e->getMessage();
   }   
EOF;

// Check http://php.net/manual/de/regexp.reference.recursive.php
$pattern = '/catch .*\{(((?>[^{}]+)|(?R))*)\}/';

echo preg_replace($pattern, '', $string);

sed不会以这种方式模式化递归。