我在更大的文件中有以下代码
}
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来实现这一点,所以如果你能解释一下究竟是做什么的,那也将有助于我的理解。
谢谢!
答案 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
不会以这种方式模式化递归。