使用 bash、sed、awk 解析像 .ini 这样的文件
Posted
技术标签:
【中文标题】使用 bash、sed、awk 解析像 .ini 这样的文件【英文标题】:Parsing file like .ini using bash, sed, awk 【发布时间】: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 最好使用 bash、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=”开头的行并在此之后更改任何内容。
对于那些仔细观察的人,我没有为请求者捕获“=”符号。
【讨论】:
以上是关于使用 bash、sed、awk 解析像 .ini 这样的文件的主要内容,如果未能解决你的问题,请参考以下文章
apache_conf 用sed和awk从bash解析YAML。
使用 bash (sed/awk) 提取 CSV 文件中的行和列?