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)
我在寻找自己问题的解决方案时发现了这个问题,这个问题类似但有点不同.我在这里修改了答案以解决我的问题.
我需要在配置文件中的块末尾插入一些文本,如下所示:
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表达式可能非常神秘,难以弄清楚 - 希望我的解释在这方面有所帮助.