【问题标题】:adding value to key=value iff value not present, from python将值添加到 key=value 如果值不存在,来自 python
【发布时间】:2014-04-29 20:12:50
【问题描述】:

我正在尝试从 python 脚本编辑配置文件。默认情况下,配置文件在一行中包含key=,没有值。但是用户可能已经编辑了 conf 文件,使其显示为key=value1。如果是这种情况,我不想编辑值,但不要管它。我对 sed 的调用如下所示:

from subprocess import call

call(["/bin/sed", "-i", "s/key=\\n/key=val/", confPath])

但这不匹配。我已经尝试使用\n 而不是\\n 并且由于“未终止的 s 命令”而导致 sed 崩溃。我用\\r 试过了,但也不匹配。

请注意,我不能调用s/key=/key=val/,因为如果文件已经包含key=val1,我可能会在conf文件中得到key=valval1

【问题讨论】:

  • 为了避免在 Python 中转义导致的任何问题,我建议使用原始字符串作为 sed 的参数,例如 r"s/key=\\n/key=val/"。此外,您可能希望使用 $ 来表示行尾。

标签: python linux sed


【解决方案1】:

我完全赞成@Jan 使用python 的ConfigParser 的解决方案,但是如果你真的喜欢使用正则表达式,你可以使用$ 行尾指示符而不是显式使用'\n' :

call(["/bin/sed", "-i", "s/key=$/&val/", confPath])

key=$ 的意思是“匹配字符串 'key=',在该行之后没有其他内容”。

& 表示“在此处包含您设法匹配的所有内容”,在您的情况下为“{KEY}="

【讨论】:

    【解决方案2】:

    尝试使用Python的真正力量,这次它有昵称ConfigParser模块,它让你对这种工作充满了舒适

    https://docs.python.org/2/library/configparser.html

    有cfg.ini:

    [Main]
    name=Jan
    surname=Vlcinsky
    

    你可以玩它:

    >>> import ConfigParser
    >>> fname = "cfg.ini"
    >>> config = ConfigParser.RawConfigParser({"age": 100})
    >>> config.get("Main", "name")
    "Jan"
    >>> config.get("Main", "age")
    100
    

    ConfigParser.RawConfigParser 的时刻给出键“年龄”的默认值。其他 ConfigParser 解析器也支持。

    这是读,写也是可能的。

    【讨论】:

      猜你喜欢
      • 2015-01-12
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多