3

我需要catch在包含数千个 PHP 文件的项目之后插入调试指令。

我想匹配模式

catch (

所以在每个匹配模式之后,我想插入指令:

Reporter::send_exception($e);

我一直在尝试使用 sed 来实现这一点,但我一直未能成功。

这是我正在使用的 sed 命令:

sed -e '/catch \(/{:a,n:\ba;i\Reporter::send_exception\(\$e\);\g' -e '}' RandomFile.php

任何帮助写这篇文章将不胜感激!

我在 Stack Overflow 中看到了针对同一问题的其他解决方案,但这些解决方案都没有奏效。

谢谢

编辑

基本上我的文件看起来很像这样:

try {
  do_something();
} catch ( AnyKindOfException $e) {
  Reporter::send_exception($e); // Here's where I want to insert the line
  // throws generic error page
}

这就是为什么我想匹配catch \(*$ 并在插入之后 Reporter::send_exception($e)

4

4 回答 4

5

您可以使用sed \a允许您附加该行的命令来执行此操作。语法是:

sed '/PATTERN/ a\
    Line which you want to append' filename

因此,在您的情况下,它将是:

sed '/catch (/ a\
Reporter::send_exception($e);' filename

测试:

$ cat fff
adfadf
afdafd
catch (
dfsdf
sadswd

$ sed '/catch (/ a\
Reporter::send_exception($e);' fff
adfadf
afdafd
catch (
Reporter::send_exception($e);
dfsdf
sadswd
于 2013-06-11T17:32:47.103 回答
2

我假设您想在包含catch (.

perl -p,下$_包含读取的行,并且$_将打印执行代码后包含的任何内容。$_所以我们只是在适当的时候附加要插入的行。

perl -pe'$_.="  Reporter::send_exception(\$e);\n" if /catch \(/'

或者

perl -pe's/catch\(.*\n\K/  Reporter::send_exception(\$e);\n/'

用法:

perl -pe'...' file.in >file.out    # From file to STDOUT
perl -pe'...' <file.in >file.out   # From STDIN to STDOUT
perl -i~ -pe'...' file             # In-place, with backup
perl -i -pe'...' file              # In-place, without backup
于 2013-06-11T17:40:26.523 回答
1

尝试:

sed 's/catch (/\0Reporter::send_exception($e);/g'
于 2013-06-11T17:28:51.330 回答
0

我相信这应该可以解决问题:

sed -e 's/catch\s*(/catch (\n\tReporter::send_exception($e);/'
于 2013-06-11T17:32:10.720 回答