修改INI格式配置文件中选项的简单Linux命令行命令

14

我正在寻找一种通用的命令行解决方案,允许我在配置文件(类似INI格式)中添加或修改配置选项。

大多数Linux配置文件使用类似INI的格式,其中 #; 作为注释符号,option=value

主要是我想找到一个可以接受文件名、选项和值的工具,并将更改配置以匹配这个值。

我希望将其用于编写自动部署脚本。我没有问题使用不在Debian或Ubuntu上默认安装的工具,只要它们存在于默认的发行版存储库中(如果需要,我可以执行apt-get install xxx)。

例如:change-config /etc/default/nginx ULIMIT '"-n 4096"'

预期结果应该是在nginx文件中有 ULIMIT="-n 4096"。显然,如果已经存在并且具有相同的值,则不应该做任何事情。如果它存在,则注释旧行并添加新行即可。

需要注意的是,这些配置文件可以在参数之间有空格/制表符,因此如果你有ULIMIT = "...",那么仍然是相同的命令。这就是为什么我在寻找比sed更好的工具,因为有许多边角情况需要评估。

此外,我不想重新发明轮子,并且我怀疑我是第一个寻找这种问题的解决方案的人。


1
@fedorqui 谢谢,我改进了这个问题,添加了更多信息。 - sorin
我不知道是否有可用于解析ini文件的实用程序,但您可以使用C ++制作自己的实用程序。请参考https://dev59.com/UnDXa4cB1Zd3GeqP9Std。此链接向您展示如何使用Boost库在C ++中读写init文件。 - Rahul R Dhobi
.ini文件通常具有非Unix工具友好的布局。但是您所描述的听起来像是典型的Unix env.rc文件。没有特定的工具可以完全满足您的要求,但是可以编写一个小型shell脚本来实现。请了解bashsed和/或awk。此外,请不要计划使用configure作为您的脚本名称,因为该名称是Unix标准安装模式的一部分,即configure; make; make install。祝你好运。 - shellter
如果您想坚持使用 shell,这个问题可能会帮助您入门。 - JoBu1324
4个回答

22

git config实际上是一个半通用的INI接口。

❱ git config --file=/etc/default/nginx somegroup.ULIMIT '-n 4096'cat /etc/default/nginx
[somegroup]
    ULIMIT = -n 4096
❱ git config --file=/etc/default/nginx somegroup.ULIMIT
"-n 4096"

不过它不支持添加顶层键。所有键都必须放置在INI风格的组中,因此在上面有一个“somegroup”。这使得它不适合您的任务,但我想为在这里找到自己的路的其他人提及一下。


3
另外,git config 似乎不允许在选项名称中使用下划线。 - Mike Spivey
1
哇!那真的可以。用这样的工具进行编辑有点奇怪,但在我的情况下,目标机器上总是安装了Git,所以它完美无误。 - Alexis Wilke
很棒的解决方案,我认为我已经找到了适用于我的用例,但遗憾的是 git config 不接受下划线作为设置名称的一部分。 - KenB

8

尝试使用crudini。顺便说一句,我认为这个文件是一个shell文件而不是一个ini文件,但是crudini在这种情况下仍然可以工作:

crudini --set /etc/default/nginx '' ULIMIT '"-n 4096"'

1
Python 3支持刚刚合并 https://github.com/pixelb/crudini/pull/57 - pixelbeat
另一个需要注意的问题:crudini 会保留现有行中等号周围的空格,但创建新条目时坚持在 = 周围添加空格。由此产生的 INI 文件可能无法被一些其他程序解析。 - Mike Spivey
1
你需要披露你是这个软件包的作者这一事实。 - shrewmouse

2
"Augeas / augtool"旨在实现这一点,尽管你需要为你想要的文件类型准备正确的镜头(你也可以自己编写),例如Nginx镜头。它还有一个API,如果需要的话。"

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接