用sed匹配的文本块之后插入一个线(use sed to insert a line after m

2019-07-30 02:43发布

我尝试使用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得到期望的结果。 谢谢!

Answer 1:

sed -e '/\[Block B\]/{:a;n;/^$/!ba;i\inserted line' -e '}'


Answer 2:

我发现这个问题,而寻找一个解决方案,以我自己的问题,这是类似的,但有一点不同。 我适应了这里的答案来解决我的问题。

我需要在这样的配置文件中块的末尾插入一些文字:

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表达式如何被写入到实现这一目标的末尾插入写出这个手写。 桑达表现可以说是相当隐蔽,难以弄清楚 - 希望我的解释在这方面的帮助。



Answer 3:

这可能会为你工作(GNU SED):

sed '/^\[Block B\]/,/^$/!b;/^$/i\inserted line' file


文章来源: use sed to insert a line after matching a block of text
标签: bash shell sed awk