在一个目录中,我有太多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