sed语法替换为保留字符

时间:2013-05-16 12:32:50

标签: batch-file sed find exec

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

我想添加

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');' {}

3 个答案:

答案 0 :(得分:1)

如果你想在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);

答案 1 :(得分:1)

试试这个:

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
> 

答案 2 :(得分:0)

这可能适合你(GNU sed):

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