在一个目录中,我有太多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)?
更新
正如这里所解释的,/^[block2]$/,/^$/是一个有效的地址。
但是,a和i都没有为我解决这个问题
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.
按照@don_crissti 的建议,这似乎适用于 GNU sed 和我的 Mac 上的 BSD:
但是,它确实取决于那里的空行,如果我们正在寻找的块是最后一个,我不确定您的文件是否有它。
我们需要 sed 来获得一个实际的换行符来启动和终止
i
命令,所以我使用 ANSI-C 引用$''
来制作一个(受 ksh/zsh/bash 支持)。在标准外壳中,您必须手动插入一个。上面的 oneliner 工作正常。它匹配 block2 和换行符之间的行,然后用 blabla[]=new_entry\n 替换换行符。让我知道任何问题
输出