【问题标题】:sed syntax for replace with reserved characters用保留字符替换的 sed 语法
【发布时间】:2013-05-11 08:28:12
【问题描述】:

我无法找出正确的语法来搜索文本文件并在找到搜索后插入新行。

我要添加

define('FS_METHOD', 'ftpext');

之后

define('WP_DEBUG', false);

仅当define('WP_DEBUG', false); 之后的行为空白时。

我的计划是在find 命令中使用它来批量更新大量 wp-config.php 文件。

我没有转义字符的尝试是:

find . -name wp-config.php -exec sed 'define('WP_DEBUG', false);
i\ define('FS_METHOD', 'ftpext');' {}

【问题讨论】:

  • 标题说的是什么保留字符?
  • 我认为,由于脚本不起作用,括号、引号和分号可能会导致问题?

标签: batch-file sed find exec


【解决方案1】:

这可能对你有用(GNU sed):

sed "N;s/define('WP_DEBUG', false);\n$/&define('FS_METHOD', 'ftpext');/;P;D" file

【讨论】:

    【解决方案2】:

    试试这个:

    perl -pe 'if($f==1 && /^$/){print "mydata";$f=0;}if(/define\(\047WP_DEBUG\047\, false\)\;/ ) {$f=1}' your_file
    

    您可以在mydata 部分中添加您想要的任何内容。

    使用您的数据在下面进行了测试:

    文件

    > cat temp
    a
    define('WP_DEBUG', false);
    b
    c
    define('WP_DEBUG', false);
    
    bjwebfwke
    

    执行

    > perl -pe 'if($f==1 && /^$/){print "define('FS_METHOD', 'ftpext');";$f=0;}if(/define\(\047WP_DEBUG\047\, false\)\;/ ) {$f=1}' temp
    a
    define('WP_DEBUG', false);
    b
    c
    define('WP_DEBUG', false);
    define(FS_METHOD, ftpext);
    bjwebfwke
    > 
    

    【讨论】:

      【解决方案3】:

      如果您想在 sed 中使用正则表达式匹配作为条件(或“地址”),则必须用斜杠将其括起来:

      sed "/define('WP_DEBUG', false);/idefine('FS_METHOD', 'ftpext');"
      

      请注意,我使用了双引号,因此可以在内部使用单引号而不会破坏表达式。

      但是,如果仅在以下行为空时才替换字符串,我会切换到 Perl:

      #!/usr/bin/perl -p
      s/^$/define('FS_METHOD', 'ftpext');/ if $previous eq "define('WP_DEBUG', false);\n";
      $previous = $_;
      

      测试它:

      echo "define('WP_DEBUG', false);
      non empty line.
      define('WP_DEBUG', false);
      
      previous line is empty
      
      What about last line?
      define('WP_DEBUG', false);" | 1.pl
      

      输出:

      define('WP_DEBUG', false);
      non empty line.
      define('WP_DEBUG', false);
      define('FS_METHOD', 'ftpext');
      previous line is empty
      
      What about last line?
      define('WP_DEBUG', false);
      

      【讨论】:

      • 太好了,Perl 脚本运行良好,但是我不知道如何在通过脚本后覆盖文件?
      • @chrismcb:您可以将-i~ 开关添加到 perl 以在保存备份的同时更改文件。
      • 太棒了,该脚本可以正常工作-在我的整个使用过程中:find . -name wp-config.php -exec wp_ftp_check.sh {} \;
      猜你喜欢
      • 2014-04-24
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多