使用sed在匹配文本块后插入一行

ton*_*ytz 5 bash shell awk sed

我尝试使用sed在以下文件中的[Block B]之后插入一行:

[Block A]  
line 1  
line 2  

[Block B]  
line 1  
line 2  

[Block C]  
line 1  
line 2  
Run Code Online (Sandbox Code Playgroud)

我用的命令:

sed '/\[Block B\]/,/^$/a\inserted line' file
Run Code Online (Sandbox Code Playgroud)

正确/期望的结果应该是:

[Block B]  
line 1  
line 2  
inserted line  
Run Code Online (Sandbox Code Playgroud)

但是,我得到了这个:

[Block B]  
inserted line  
line 1  
inserted line  
line 2  
inserted line  
Run Code Online (Sandbox Code Playgroud)

请告诉我如何使用sed获得所需的结果.谢谢!

Pau*_*ce. 12

sed -e '/\[Block B\]/{:a;n;/^$/!ba;i\inserted line' -e '}'
Run Code Online (Sandbox Code Playgroud)

  • @tonytz:额外的`-e`就像`i`和`a`这样的命令知道插入或附加字符串的结束位置. (3认同)
  • @tonytz您可能会喜欢这些[sed one-liners](http://sed.sourceforge.net/sed1line.txt) (2认同)

sta*_*fry 6

我在寻找自己问题的解决方案时发现了这个问题,这个问题类似但有点不同.我在这里修改了答案以解决我的问题.

我需要在配置文件中的块末尾插入一些文本,如下所示:

name1 {
    ...
}

name2 {
    ...
    inserted text line 1
    inserted text line 2
}

name3 {
    ....
}
Run Code Online (Sandbox Code Playgroud)

为了达到这个目的,我从上面获取了@toyntz评论并对其进行了调整:

/^name2 {/,/^}/{
    /^}/i\    inserted text line 1
    /^}/i\    inserted text line 2
}
Run Code Online (Sandbox Code Playgroud)

那只是sed的表达; 它可以放在一个文件中,并执行sed -f如下:

$ sed -f sed_expression data_file
Run Code Online (Sandbox Code Playgroud)

该第一个表达式搜索一系列行,这些行以name2 {在行的开头出现并以}也在行的开头结束.选择要处理的块.其余的表达式用{大括号括起来,}并在选定的范围内运行.它包含我们希望插入的每行一个命令,每个命令都有一个表达式/^}/,该表达式与具有结束大括号的行匹配,后跟插入i操作以插入一行文本.接下来i是一个,\以便插入前导空格.

然后我进一步使用了表达式,用一个替换了两个insert命令:

/^name2 {/,/^}/{
    /^}/i\
    inserted text line 1\
    inserted text line 2
}
Run Code Online (Sandbox Code Playgroud)

这里,一个命令插入的文本分布在以下两行中.请注意\第一行上的附加尾随以继续单个命令.

接下来,我把它减少到一行.它使它变得混乱和难以阅读,但它仍然有效:

/^name2 {/,/^}/{/^}/i\    inserted text line 1\n    inserted text line 2
}
Run Code Online (Sandbox Code Playgroud)

要插入的两行由换行符分隔\n.精明的读者会注意到那里实际上有两条线 - 你不能把右支撑放在第一条线的末端; 这就是为什么上面的其他答案都有第二个表达式.所以,上面是我能做的最好的.要在bash命令行上表示:

sed -e '/^name2 {/,/^}/{/^}/i\    inserted text line 1\n    inserted text line 2' -e '}' data_file
Run Code Online (Sandbox Code Playgroud)

我已经写出了这个简写,希望它向任何想要在文本块的末尾插入如何编写sed表达式以实现该目的的人解释.Sed表达式可能非常神秘,难以弄清楚 - 希望我的解释在这方面有所帮助.