答案1
Sed 非常适合文本替换。我没有靠近 bash shell 来测试这个,但粗略地说,鉴于我对你的问题的了解有限,你需要/已经可用的命令是
sed '/in lines containing this/cut this/paste this/' in.file >out.file
它还采用替代的“s/this/that/”格式,并且是一系列管道命令的理想选择
答案2
这有多简单取决于该工具在非标称条件下的行为方式。如果文件中总是有一个块带有特殊注释,那么使用 awk 就足够简单了。
awk '
/^## end my-block$/ {skip=0}
!skip {print}
/^## start my-block$/ {skip=1; system("cat new-block-content") || exit(1)}
' </etc/some-server/some-server.conf >/etc/some-server/some-server.conf.new &&
mv /etc/some-server/some-server.conf.new /etc/some-server/some-server.conf
如果您想在末尾添加该块(如果尚未存在),这仍然不太难:
awk '
/^## end my-block$/ {skip=0}
!skip {print}
/^## start my-block$/ {skip=1; system("cat new-block-content") || exit(1)}
END {print "## start my-block"; system("cat new-block-content") || exit(1); print "## end my-block"}
' </etc/some-server/some-server.conf >/etc/some-server/some-server.conf.new &&
mv /etc/some-server/some-server.conf.new /etc/some-server/some-server.conf
处理其他场景(例如存在开始注释但不存在结束注释、多个块……)会变得越来越困难。