【问题标题】:Modifying ini files using shell script使用 shell 脚本修改 ini 文件
【发布时间】:2013-11-03 05:45:10
【问题描述】:

我有一个类似的ini 文件

[test]
foo=bar

如果我们将此ini 文件称为test1.ini

如何将foo 的值更改为foobarbaz,例如使用shell script

我尝试了以下方法,但它对我不起作用。我没有在 ini 文件中看到更新的更改。怎么写?

sed "/^foo=/s/=.*/=foobarbaz/" < test1.ini

你还有什么建议

【问题讨论】:

  • 假设你的意思是你想要foo=foobarbaz 而不是foobarbaz=bar,你的代码在 Windows、mingw (MSYS)、bash 下对我有用。引用依赖于 shell;尝试在 sed 字符串周围使用单引号 (') 而不是双引号 (")。
  • 使用-i 选项。 sed -i "/^foo=/s/=.*/=foobarbaz/" test1.ini(注意重定向&lt;已从命令中删除)。

标签: shell ini


【解决方案1】:

我个人使用更详细的sed 命令,因为相同的选项可能会出现在几个不同的部分:

sh$ sed -i.bak '/^\[test]/,/^\[/{s/^foo[[:space:]]*=.*/foo = foobarbaz/}' test1.ini
#       ^^^^^^  ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#    make a       in the right         perform the substitution
#   *backup*       section                as you want

作为安全网,我要补充:

sh$ diff test1.ini{,.bak}
2c2
< foo = foobarbaz
---
> foo=bar

【讨论】:

    【解决方案2】:

    要更新文件,请使用 sed 的 -i 选项:

    sed -i "/^foo=/s/=.*/=foobarbaz/" test1.ini
    

    来自man sed

    -i[SUFFIX],--就地[=SUFFIX]

    就地编辑文件(如果提供了 SUFFIX,则进行备份)

    所以你也可以这样做

    sed -i.bak "/^foo=/s/=.*/=foobarbaz/" test1.ini
    

    【讨论】: