我有一个sample.txt
这样的文件:
lots of text
lots of text
#nvram = [
# these
# could
# be,
# anything
#]
lots of text
lots of text
我想添加一些文本“foobar”来得到这个:
lots of text
lots of text
#nvram = [
# these
# could
# be,
# anything
#]
foobar
lots of text
lots of text
我查看了一些相关的线程并尝试了很多东西,但无法以正确的方式将信息连接在一起。
多行匹配: 如何使用 sed 或 ex 将块(多行代码)替换为新的文本块(代码)? https://stackoverflow.com/questions/11234001/replace-multiple-lines-using-sed 如何使用 sed 替换多行字符串?
附加: 如何使用 sed 在“test message1”之后添加新行?
我一直在尝试这样的东西:
sed '/^#nvram = \[$/{
N
^.*$
}/abc123/' sample.txt
sed '/^#nvram = \[$/ {N; s/\<^#nvram = \[$\>\n<^.*$\>/abc123/g}' sample.txt
sed '/^#nvram = \[$/ {N; s/\<#nvram = \[\>\n\<.*\>/abc123/g}' sample.txt
sed '/^#nvram = \[$/ {N; s/#nvram = \[\n.*/abc123/g}' sample.txt
sed '/^#nvram = \[$/ {N; /#nvram = \[\n.*/abc123/a}' sample.txt
sed '/^#nvram = \[$/ {N; /#nvram = \[(\n.*){1,}/abc123/a}' sample.txt
sed '/^#nvram = \[$/!b;n;cABC' sample.txt
sed '/^#nvram = \[$/N;cABC' sample.txt
sed '/^#nvram = \[$/N/#\]/a;cABC' sample.txt
sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/!{s/./abc/g}}' sample.txt
sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/!{/abc/a}}' sample.txt
sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/!/a abc}' sample.txt
sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/;/a abc}' sample.txt
sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/a abc}' sample.txt
但到目前为止,我还没有成功。
使用循环怎么样?
解释:
至少在 GNU sed 中,这可以写成单行
使用 GNU sed
-z
:您可能需要调整正则表达式,具体取决于您对“任何东西”的真正含义(例如它是否可以包含 a
]
)以及您的文件中是否有其他类似的块。这会更健壮,例如,如果
anything
不包含]
s 并且您的输入中有其他类似的块:我将选择您采用的一种方法并向您展示如何使其发挥作用,以便它引起共鸣并与您保持联系:
我个人不喜欢上面的方法,并且做的有些不同:
这里还有一个简单的 sed:
它找到
#nvram = [
发生了的行,然后找到之后的所有行,直到第一次出现 an#]
被解决,然后你替换#]\nfoobar
for#]
。