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

1 人关注

我想用sed在我的Wordpress wp-config.php 文件中添加一些PHP代码。但在添加时,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 );

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

一切都进行得很完美,但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 );

但我想要一些像下面这样的东西。

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
regex
wordpress
bash
sed
Arun Singh
Arun Singh
发布于 2016-03-13
2 个回答
Tom Fenech
Tom Fenech
发布于 2016-03-14
已采纳
0 人赞同

你遇到问题的原因是你在 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 命令中使用引号。它还允许你更清楚地写出你打算附加的文本--你唯一需要记住的是在字符串的每一行的末尾添加\

Benjamin W.
Benjamin W.
发布于 2016-03-14
0 人赞同

替代方案是使用 r 命令读入文件。

我们的PHP文件, test.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
if ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
    $forwarded_ips = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] );
    $_SERVER['REMOTE_ADDR'] = $forwarded_ips[0];
    unset( $forwarded_ips );