我尝试使用SED在下面的文件中插入[B座]之后的一行:
[Block A]
line 1
line 2
[Block B]
line 1
line 2
[Block C]
line 1
line 2
我使用的命令:
sed '/\[Block B\]/,/^$/a\inserted line' file
正确的/期望的结果应该是:
[Block B]
line 1
line 2
inserted line
不过,我得到这个:
[Block B]
inserted line
line 1
inserted line
line 2
inserted line
请告诉我怎样才能使用SED得到期望的结果。 谢谢!
sed -e '/\[Block B\]/{:a;n;/^$/!ba;i\inserted line' -e '}'
我发现这个问题,而寻找一个解决方案,以我自己的问题,这是类似的,但有一点不同。 我适应了这里的答案来解决我的问题。
我需要在这样的配置文件中块的末尾插入一些文字:
name1 {
...
}
name2 {
...
inserted text line 1
inserted text line 2
}
name3 {
....
}
要做到这一点我从上面@toyntz发表评论,并适应这样说:
/^name2 {/,/^}/{
/^}/i\ inserted text line 1
/^}/i\ inserted text line 2
}
这仅仅是个sed的表达; 它可以被放在一个文件,并执行sed -f
是这样的:
$ sed -f sed_expression data_file
此第一表达搜索的范围内开始的行name2 {
在一行的开头存在的和结尾}
也发生在一行的开头。 这选择上下工夫块。 剩余的表达被封闭在{
花括号}
和所选择的范围内工作。 它每行包含我们希望插入,每一种表达一个命令/^}/
匹配与右大括号后插入线i
操作以插入一个文本行。 在i
后面有\
使领导空白也被插入。
然后我把表达的位进一步,与一个替换两个插入命令:
/^name2 {/,/^}/{
/^}/i\
inserted text line 1\
inserted text line 2
}
这里通过一个命令插入文本跨越以下两行传播。 注意额外的尾随\
第一行继续单个命令。
接下来,我把它还原成一条线。 它使混乱和难以阅读,但它仍然有效:
/^name2 {/,/^}/{/^}/i\ inserted text line 1\n inserted text line 2
}
这两条线将被插入由一个换行分隔\n
。 细心的读者会注意到,其实有两行有 - 你不能把右括号在第一行的末尾; 这就是为什么上面的其他的答案具有第二-e表达。 所以,上面的是我能做到的最好。 以表示一个bash命令行上:
sed -e '/^name2 {/,/^}/{/^}/i\ inserted text line 1\n inserted text line 2' -e '}' data_file
我希望它解释给任何人看的文本块一个sed表达式如何被写入到实现这一目标的末尾插入写出这个手写。 桑达表现可以说是相当隐蔽,难以弄清楚 - 希望我的解释在这方面的帮助。
这可能会为你工作(GNU SED):
sed '/^\[Block B\]/,/^$/!b;/^$/i\inserted line' file