替换 .ini 文件中的重复字段

替换 .ini 文件中的重复字段

你好,我是新手,所以请耐心等待。我有一个配置文件 .ini,我正在尝试通过 cl 编辑它,并且我正在尝试编写一个脚本,在其中我可以简单地替换它们的设置值。例如将 false 更改为 true

[logs] 
enabled = false 

[smtp] 
enabled = false 

[system] 
enabled = false 

如何使用 sed 或 awk(或任何其他工具)将 smtp 的启用设置为 true 并保存文件而不将输出写入 shell 本身

编辑:我尝试使用这个sed -i 's/[smtp]\nenabled = false/[smtp]\nenabled = true/' file.ini,但它对我不起作用

答案1

您的 INI 文件实际上是格式正确的 TOML 文件。 TOML(Tom's Obvious,Minimal Language)是一种用于配置文件的结构化文档格式。作为一种结构化文档格式,面向行的工具sed并不真正适合解析它,部分原因是数据可能是多行的(TOML 支持“表数组”),部分原因是数据可能被编码。

使用 TOML 感知工具不仅为您提供了一种安全的方式来访问和修改文件,而且还使这一切变得非常容易。

使用tomlq,一个围绕 JSON 解析器的 TOML 解析器包装器,它是fromjq的一部分yqhttps://kislyuk.github.io/yq/

tomlq -t '.smtp.enabled |= true' file.ini

这将读取您的 TOML 文件并使用新值更新该smtp部分的键。enabled

考虑到您问题中的数据,输出将是

[logs]
enabled = false

[smtp]
enabled = true

[system]
enabled = false

该工具还可以使用其或选项tomlq“就地”进行更改。-i--in-place

答案2

这可能就是您想要的,在每个 Unix 机器上的任何 shell 中使用任何 awk:

$ awk '/]/{tag=$1} (tag=="[smtp]") && ($1=="enabled"){$3="true"} 1' file
[logs]
enabled = false

[smtp]
enabled = true

[system]
enabled = false

或者可能:

$ awk 'BEGIN{RS="";ORS="\n\n";FS=OFS="\n"} $1=="[smtp]"{$2="enabled = true"} 1' file
[logs]
enabled = false

[smtp]
enabled = true

[system]
enabled = false

或各种其他事情...正确的答案实际上完全取决于您的输入文件除了到目前为止在示例中显示的内容之外还包含其他内容。

答案3

命令:

sed -i '/smtp/{n;s/false/true/g}' file

输出

[logs]
enabled = false

[smtp]
enabled = true

[system]
enabled = false

相关内容