【问题标题】:Sed is ignoring sinqle quotes when adding lines to a file向文件添加行时,Sed 忽略了单引号
【发布时间】:2016-06-28 11:21:37
【问题描述】:

我想使用 sed 将一些 PHP 代码添加到我的 Wordpress 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 );
}

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      使用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中的代码进行相应的缩进。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 2011-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多