我有一条特定的 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>";?'