2017-05-08 63 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