2017-05-08 64 views
3

我想用一個腳本,還執行其他操作編輯配置文件替換多行文本。查找和命令行

該腳本需要找到某些連續的文本行並將其刪除。 原地需要粘貼一個新的配置,從舊配置所在的位置開始。在舊的和新的配置中,空間的使用都很重要。

在configfile.php,此段文字:

'session' => 
    array (
    'save' => 'files', 
), 

需要找到並與內容我把replacement.txt在同一地點所取代。

基於回答類似的問題,我試過的事情之一就是:

cat replacement.txt <(sed -i '1,/ 'session' => \n array (\n 'save' => 'files',\n ),/d' configfile.php) > configfile.php 

這將導致一個空文件。

cat replacement.txt <(sed -i '1,/ 'session' => \n array (\n 'save' => 'files',\n ),/d' configfile.php) > newfile.php 

這和貓replacement.txt> newfile.php一樣,我想編輯一個文件,而不是創建一個新文件。

有誰知道什麼是錯我的語法,我該如何解決?

我已經問過這個問題here之前,但我沒有完全理解我我想要的東西,所以它變得有點太複雜和混亂。我使用Debian Linux。

編輯基於評論:

的replacement.txt看起來是這樣的:

'session' => 
    array (
    'save' => 'redis', 
    'redis' => 
     array (
      'host' => '127.0.0.1', 
      'other_variable' => 'other_setting', 
     ) 
    ) 
), 

它已經縮進的方式應該和可以插入原樣。 使用awk或sed都很好。

+1

謝謝你的幫助。我已經更新了這個問題。 – phol

+0

唯一的東西,現在缺少的是簡潔configfile.php輸入文件,顯示要在其他行加上所需的輸出,顯示發生後更換同外商投資企業之間的上下文來替換字符串。 –

回答

1

隨着GNU AWK用於多炭RS:

$ cat tst.awk 
BEGIN { RS="^$"; ORS="" } 
ARGIND==1 { old = $0 } 
ARGIND==2 { new = $0 } 
ARGIND==3 { 
    if (start = index($0,old)) { 
     $0 = substr($0,1,start-1) new substr($0,start+length(old)) 
    } 
    print 
} 

$ awk -f tst.awk target.txt replacement.txt configfile.php 
    foo 
    'session' => 
    array (
    'save' => 'redis', 
    'redis' => 
     array (
      'host' => '127.0.0.1', 
      'other_variable' => 'other_setting', 
     ) 
    ) 
), 
    bar 

上述被這些輸入文件上運行:

$ cat target.txt 
    'session' => 
    array (
    'save' => 'files', 
), 
$ 
$ cat replacement.txt 
    'session' => 
    array (
    'save' => 'redis', 
    'redis' => 
     array (
      'host' => '127.0.0.1', 
      'other_variable' => 'other_setting', 
     ) 
    ) 
), 
$ 
$ cat configfile.php 
    foo 
    'session' => 
    array (
    'save' => 'files', 
), 
    bar 
$ 

與其他awks它會是:

$ cat tst.awk 
FNR==1 { ++argind } 
argind==1 { old = (FNR>1 ? old RS : "") $0 } 
argind==2 { new = (FNR>1 ? new RS : "") $0 } 
argind==3 { rec = (FNR>1 ? rec RS : "") $0 } 
END { 
    if (start = index(rec,old)) { 
     rec = substr(rec,1,start-1) new substr(rec,start+length(old)) 
    } 
    print rec 
} 

$ awk -f tst.awk target.txt replacement.txt configfile.php 
    foo 
    'session' => 
    array (
    'save' => 'redis', 
    'redis' => 
     array (
      'host' => '127.0.0.1', 
      'other_variable' => 'other_setting', 
     ) 
    ) 
), 
    bar 
+1

非常感謝您的幫助! 通過與附加awk命令「> TMP && MV TMP configfile.php」,就像你在我剛纔的問題建議我現在能找到和我的文件替換。 – phol