2013-05-16 51 views
0

我無法找出正確的語法來搜索文本文件並在找到搜索後插入新行。用於替換保留字符的sed語法

我想補充

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

什麼保留字符標題在談論什麼? – choroba

+0

我認爲,由於腳本不起作用,括號,引號和分號可能引起問題? – chrismcb

回答

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); 
+0

非常好,Perl腳本運行良好,但是我很遺憾一旦通過腳本來覆蓋文件? – chrismcb

+0

@chrismcb:您可以將'-i〜'開關添加到perl以在保存備份的同時更改文件。 – choroba

+0

非常好,劇本的作品 - 在我的整個使用中:'find。 -name wp-config.php -exec wp_ftp_check.sh {} \;' – chrismcb

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 
> 
+0

謝謝,第一個解決方案也完成了這項工作! – chrismcb

0

這可能會爲你工作(GNU SED):

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

謝謝,我已經使用了上面的初始答案。 – chrismcb