查找文本,然后在多个文件中插入换行符和一些 php 代码

查找文本,然后在多个文件中插入换行符和一些 php 代码

我有一条特定的 php 代码注释,它出现在多个用户的大约 75 个文件中。此命令成功找到了它。(我没有费心寻找双斜杠,因为我不确定是否要转义它们,而且它们对于此匹配来说真的不重要。)

grep -l -r "calls the myfunc() function" /home/*/public_html   

找到之后,我需要添加换行符和一些 php 代码,例如

if($my_return_var===false){echo "<b>THERE WAS AN ERROR</b>";}

我还需要做类似的事情,比如

grep -l -r "include('path/to/my/file.php')" /home/*/public_html   

然后在它之前插入

"$my_return_var="

在 Google 上搜索后,我发现通过管道传输到 sed 可能是可行的方法,但我不确定语法。

有人能帮忙吗?顺便说一句,这个问答可能很接近,但还是有点超出我的理解范围。如何在 Linux 中替换多个文件中的文本字符串

答案1

sed当它看到某种模式时可以进行插入和附加:

grep -l -r "calls the myfunc() function" /home/*/public_html |
xargs sed -i '/calls the myfunc() function/a\
if($my_return_var===false){echo "<b>THERE WAS AN ERROR</b>";}
'

grep -l -r "include('path/to/my/file.php')" /home/*/public_html |
xargs sed -i "/include('path\\/to\\/my\\/file.php')"'/i\
"$my_return_var="
'

答案2

第一件事:进行备份!

第二件事:进行备份!

因为我对 perl 的了解远胜于 python,所以我会使用 perl 解决方案。

请记住,“\n”是 perl 中的换行符,因此,如下所示:

grep -l -r "calls the myfunc() function" /home/*/public_html |xargs perl -pi -e 's/(calls the myfunc() function;)/$1\n if($my_return_var===false){echo "<b>THERE WAS AN ERROR</b>";}/'

我显然没有测试过这一点,这是一种蛮力方法(并且假设了很多事情,例如,grep 不会返回带有空格的文件名等等)。如果您的搜索/替换模式包含“/”,您可以使用替代分隔符作为模式,例如,s?(calls the myfunc() function;)?$1\n if($my_return_var===false){echo "<b>THERE WAS AN ERROR</b>";?'

相关内容