在向文件添加行时,Sed忽略了sinqle引号

时间:2016-03-13 12:32:27

标签: php regex wordpress bash sed

我想使用sed将一些PHP代码添加到我的Wordpress /* =WordPress Core -------------------------------------------------------------- */ .aligncenter, div.aligncenter { display: block; margin: 5px auto 5px auto; } a img.aligncenter { display: block; margin-left: auto; margin-right: auto } 文件中。但是在添加时,sed会忽略我添加的文字中的wp-config.php

我想添加这些行

'

开始if ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) { $forwarded_ips = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] ); $_SERVER['REMOTE_ADDR'] = $forwarded_ips[0]; unset( $forwarded_ips ); } 标记后。

这是我使用的sed命令:

php

一切都很顺利,但是sed忽略了单引号sed -i '/<?php/a "if ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {\n\t$forwarded_ips = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] );\n\t$_SERVER['REMOTE_ADDR'] = $forwarded_ips[0];\n\tunset( $forwarded_ips );\n}"' wp-config.php

我的输出如下所示:

'

但我想要一些如下的内容:

if ( !empty( $_SERVER[HTTP_X_FORWARDED_FOR] ) ) {
        $forwarded_ips = explode( ,, $_SERVER[HTTP_X_FORWARDED_FOR] );
        $_SERVER[REMOTE_ADDR] = $forwarded_ips[0];
        unset( $forwarded_ips );
}

Sed忽略了字符if ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) { $forwarded_ips = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] ); $_SERVER['REMOTE_ADDR'] = $forwarded_ips[0]; unset( $forwarded_ips ); } 并为该字符添加了空格。

2 个答案:

答案 0 :(得分:2)

您遇到问题的原因是您在sed命令周围使用单引号,并且还在您尝试插入的字符串中使用。这意味着你拥有的是单引号中命令的第一部分,后跟引号之外的字符串HTTP_X_FORWARDED_FOR等。

请改为尝试:

sed -i -f script.sed wp-config.php

script.sed包含以下内容:

/<?php/a\
if ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {\
    $forwarded_ips = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] );\
    $_SERVER['REMOTE_ADDR'] = $forwarded_ips[0];\
    unset( $forwarded_ips );\
}

使用脚本文件意味着您不必担心在sed命令中使用引号。它还允许您更清楚地写出要添加的文本 - 您唯一需要记住的是在字符串中每行的末尾添加\

答案 1 :(得分:0)

使用r命令读取文件的替代解决方案:

我们的PHP文件test.php如下所示:

<?php
    echo "Hello World";
    echo "\n";
?>

我们可以将逐字记录的完整内容放入单独的文件中insert

if ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
    $forwarded_ips = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] );
    $_SERVER['REMOTE_ADDR'] = $forwarded_ips[0];
    unset( $forwarded_ips );
}

r命令将文件名作为参数,并在当前周期结束时打印其内容,处理任何引用和特殊字符问题:

$ sed '/<?php/r insert' test.php
<?php
if ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
    $forwarded_ips = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] );
    $_SERVER['REMOTE_ADDR'] = $forwarded_ips[0];
    unset( $forwarded_ips );
}
    echo "Hello World";
    echo "\n";
?>

要修复缩进,我们可以相应缩进insert中的代码。