3

我有一个这样的文件:

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

[User3]
name=
pwd=
..

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

PS最好使用bashsedawk

4

4 回答 4

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
于 2013-02-20T22:00:03.557 回答
2

您可以使用这样的三个规则(兼容 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=
..
于 2013-02-20T22:16:08.047 回答
1

这是 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)
于 2013-02-20T22:15:49.533 回答
0

根据 sed 的要求:

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

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

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

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

于 2016-04-29T20:47:45.597 回答