![替換文件中區塊的工具](https://rvso.com/image/97243/%E6%9B%BF%E6%8F%9B%E6%96%87%E4%BB%B6%E4%B8%AD%E5%8D%80%E5%A1%8A%E7%9A%84%E5%B7%A5%E5%85%B7.png)
答案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
處理其他場景(例如存在開始註釋但不存在結束註釋、多個區塊…)會變得越來越困難。