sed 在块后追加一行

sed 在块后追加一行

在一个目录中,我有太多site.ini.append.php(大约100个文件)。

它们看起来都像:

[block1]
blabla[]
blabla[]=blabla
...
blabla[]=blabla

[block2]
blabla[]
blabla[]=blabla
...
blabla[]=blabla

[block3]
blabla[]
blabla[]=blabla
...
blabla[]=blabla

但是,[block1]根据文件的不同,条目数也不同。其他块也是同样的情况。

我需要在末尾添加一个新行[block2]

[block2]
blabla[]
blabla[]=blabla
...
blabla[]=blabla
blabla[]=new_entry

我不能只使用行号,因为正如我所说,块具有不同的条目,并且[block2]一个文件中可能有 20 行,另一个文件中可能有 10 行,等等......

我在想这样的事情

sed -n '/^\[block2\]$/,/^$/ a blabla[]=new_entry' path/to/one_of_the_site.ini.append.php

但显然它不起作用,因为/^\[block2\]$/,/^$/它不是一个地址。

我该如何做(最好使用 sed)?

更新

正如所解释的这里,/^[块2]$/,/^$/是一个有效的地址。

然而,两者都没有A,也不为我解决了问题

sed -n '/^\[block2\]$/,/^$/ a blabla[]=new_entry' path/to/one_of_the_site.ini.append.php 

sed -n '/^\[block2\]$/,/^$/ i blabla[]=new_entry' path/to/one_of_the_site.ini.append.php 

环境

$ sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

答案1

按照 @don_crissti 的建议,这似乎可以在 GNU sed 和我的 Mac 上的 BSD 中工作:

sed -e $'/^\\\[block2\\\]$/,/^$/ {/^$/i\\\nnew line\n}' < input

但是,它确实取决于那里的空行,如果我们要查找的块是最后一个,我不确定您的文件是否有它。

我们需要 sed 来获取实际的换行符来启动和终止命令i,因此我使用 ANSI-C 引用$''来制作一个换行符(由 ksh/zsh/bash 支持)。在标准 shell 中,您必须手动插入一个。

答案2

 sed  '/block2/,/^$/s/^$/blabla[]=new_entry\n/g' filename

上面的 oneliner 工作正常。它匹配 block2 和换行符之间的行,然后用 blabla[]=new_entry\n 替换换行符。如有任何问题请告诉我

输出

[block1]
blabla[]
blabla[]=blabla
...
blabla[]=blabla

[block2]
blabla[]
blabla[]=blabla
...
blabla[]=blabla
blabla[]=new_entry

[block3]
blabla[]
blabla[]=blabla
...
blabla[]=blabla

相关内容