替换文件中块的工具

替换文件中块的工具

大多数配置管理软件工具都有一种方法来替换文件中的块。

例子:

我正是想要这个,但不需要这些大型工具的开销。

有没有一个简单的工具来更新和维护文本文件中的块?

示例:我要更新/etc/some-server/some-server.conf

我想插入/更新这样的块:

## start my-block
key1=value1
key2=value2
## end my-block

我知道我可以用 awk 或 python 的一些行来做到这一点,但我搜索了一个现成的工具。

答案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

处理其他场景(例如存在开始注释但不存在结束注释、多个块……)会变得越来越困难。

相关内容