【问题标题】:Linux SED search replace multiple per lineLinux SED 搜索每行替换多个
【发布时间】:2011-08-15 16:41:18
【问题描述】:

我需要用我创建的 PHP 函数替换客户端网站中的一大堆 PHP 超级全局变量,以从 xss 攻击中清除超级全局变量。

原始代码如下所示:

echo $_REQUEST['HELLO1'] . ' AND ' . $_REQUEST['HELLO2'];

我需要它看起来像这样:

echo MYCLASS::myfunction($_REQUEST['HELLO1']) . ' AND ' . MYCLASS::myfunction($_REQUEST['HELLO2']);

主要问题,我需要对 100 多个文件进行搜索/替换!哎呀!

所以我的解决方案是这样的(在 linux shell 中):

sudo sed -i 's/\$_REQUEST[.*\]/MYCLASS::myfunction(&)/g' *.php

只要每行只出现一个“$_REQUEST”实例就可以很好地工作......但是对于多个实例,它会搞砸并执行以下操作:

echo MYCLASS::myfunction($_REQUEST['HELLO1'] . ' AND ' . $_REQUEST['HELLO2']);

【问题讨论】:

    标签: php regex search replace sed


    【解决方案1】:

    应该这样做:

    sed -i "s/\$_REQUEST\[\([^\x5d]*\)\]/MYCLASS::myfunction(\1)/g" *.php
    

    我在匹配] 时遇到了很多麻烦,所以我选择了\x5d

    【讨论】:

    • 我得到一个“-e 表达式 #1, char 43: invalid reference \1 on `s; command's
    【解决方案2】:

    问题在于.* 是贪婪的,它会找到尽可能长的匹配。要解决这个问题,请改用[^]]*,这样您就不会无意中抓住一组额外的方括号。

    sudo sed -i 's/\$_REQUEST\[[^]]*\]/MYCLASS::myfunction(&)/g' *.php
    

    在其他正则表达式方言中,您也可以编写 .*? 以使通配符不贪婪,但这似乎在 sed 中不起作用(至少在我的版本中不起作用,甚至在 sed -r 中也不起作用)。

    【讨论】:

    • 感谢您的帮助。这 。*?概念很有趣。答案不起作用。我们正在尝试 .*?。谢谢!
    【解决方案3】:

    在 Perl 中,以下脚本将在您向脚本传递您感兴趣的文件的名称时运行
    假设脚本是 t.pl,您的文件是 file.php
    输出回 file.php
    perl t.pl file.php > file.php
    输出到另一个文件,这样您就不会覆盖原来的
    perl t.pl file.php > another_file.php

    #!/usr/bin/perl
    
    $FILE_NAME = $ARGV[0];
    
    open (FILE_NAME) or die ("Could not open FILE_NAME information file: $FILE_NAME \n");
    @file_contents = <FILE_NAME>;
    close (FILE_NAME);
    
    
    foreach $line (@file_contents) {
           chomp($line);
           $line =~ s/\$_REQUEST\[.*?\]/MYCLASS\:\:myfunction\($&\)/g;
           print $line." \n";
    }
    

    退出;

    【讨论】:

    • 不确定我是否应该得到解决方案标记,因为我没有使用 sed,但很高兴这个 Perl 脚本对你有用。
    【解决方案4】:

    试试这个 sed 命令:

    sed -i.bak 's/\$_REQUEST\[\([^]]*\)\]/MYCLASS::myfunction(\1)/g' *.php
    

    或在 perl 中:

    perl -pe 's/\$_REQUEST\[([^]]*)\]/MYCLASS::myfunction(\1)/g' file.php
    

    【讨论】:

    • 不客气,我在上面的回答中也为您提供了一个 perl 1 衬里来做同样的事情。
    • 我有一个问题.. 它用 $_REQUEST(' ') 替换 $_REQUEST[' '] 知道如何解决吗?
    • 将 myfunction(\1) 更改为 myfunction([\1]).. 做到了!谢谢!
    • 如果其他人也有同样的问题,我其实改成这个 myfunction($_REQUEST[\1])
    【解决方案5】:

    sed 's/\$_REQUEST\[[^]]*\]/MYCLASS::myfunction(&amp;)/g'

    【讨论】:

      猜你喜欢
      • 2021-02-18
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 2018-12-22
      • 2014-09-13
      • 1970-01-01
      • 2018-06-06
      • 2011-08-16
      相关资源
      最近更新 更多