【问题标题】:Parsing file like .ini using bash, sed, awk使用 bash、sed、awk 解析像 .ini 这样的文件
【发布时间】:2013-02-06 02:05:00
【问题描述】:

我有一个这样的文件:

[User1]  <- unique id
name=    <- values can be empty
pwd=
...
         <- empty line
[User2]
name=
pwd=
..

[User3]
name=
pwd=
..

我需要能力: 获取User2 的字段值 更改字段值(例如pwd)。

PS 最好使用 bashsedawk

【问题讨论】:

    标签: bash parsing sed awk


    【解决方案1】:

    你可以用这样的三个规则来做到这一点(nawk 兼容):

    awk -F= '
      /^\[/ { user=$1; gsub("[][]","",user) }
      user == "User2" && $1 == "pwd" { $0=$1"=some_pwd" }
      1
    '
    

    输出:

    [User1]
    name=
    pwd=
    ...
    
    [User2]
    name=
    pwd=some_pwd
    ..
    
    [User3]
    name=
    pwd=
    ..
    

    【讨论】:

      【解决方案2】:

      这是一个更改 pwd 值的简单解决方案。如果pwd 是最后一个字段,这将在记录末尾添加一个额外的换行符。

      awk '/^\[User2\]/ { sub( "\npwd=[^\n]*(\n|$)", 
          "\npwd=newvalue\n") } 1' ORS='\n\n' RS= input-file > output-file
      mv output-file > input-file
      

      【讨论】:

      • 其实我不知道最后一个字段。此外,字段数可能因不同的Users 而异
      • 字段计数无关紧要,但如果您要更改的字段恰好是最后一个,您将获得一个额外的换行符。如果额外的换行符很重要,可以轻松删除。
      【解决方案3】:

      这是 Python 与 AWK 的明显胜利,因为 Python 带有一个内置模块来解决这类问题。

      模块名称从 Python 2.x 更改为 Python 3.x;顶部的 try 块应该允许它与 Python 2.x 或 Python 3.x 一起使用(我在我的计算机上对它进行了测试)。

      编辑:我只是稍微改进了答案。现在它不是写入一个新文件,而是写入一个临时文件,当它成功完成后,它会删除原始文件并将临时文件重命名为原始文件名。在非 Windows 系统上,删除原始文件的步骤是可选的。

      import os
      import sys
      
      try:
          import ConfigParser as cp
      except ImportError:
          import configparser as cp
      
      try:
          _, fname = sys.argv
      except Exception:
          print("Usage: configedit <filename>")
      
      temp_file = fname + ".tempfile"
      
      c = cp.ConfigParser()
      c.read(fname)
      
      c.set("User2", "pwd", "XkcdApprovedLongerPassword")
      with open(temp_file, "w") as f:
          c.write(f)
      
      os.remove(fname)
      os.rename(temp_file, fname)
      

      【讨论】:

        【解决方案4】:

        根据 sed 的要求:

        sed -i "/\[User2\]/,/^$/{s/\(^pwd\)\=.*$/\1\=password/}"
        

        将上面一行中的“密码”更改为您要在文件中更改密码的任何内容。

        此脚本将在“[User2]”和下一个空白行之间进行搜索。 然后它将找到以“pwd=”开头的行并在此之后更改任何内容。

        对于那些仔细观察的人,我没有为请求者捕获“=”符号。

        【讨论】:

          猜你喜欢
          • 2018-03-31
          • 2016-10-18
          • 1970-01-01
          • 2015-01-12
          • 2018-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-30
          相关资源
          最近更新 更多