我需要从具有典型结构的 ini 文件中检索键的值:
[abcd]
key1=a
key2=b
[efgh]
key1=c
key2=d
[hijk]
key1=e
key2=f
Run Code Online (Sandbox Code Playgroud)
关键名称在不同的部分中重复,并且部分的命名/顺序没有一致。我怎么能从 efgh 中找到 key1?如果我 grep 然后我会找到所有的 key1(而且我不知道这些部分的顺序)。
我怀疑 sed 或 awk 可以做到这一点,但我找不到它...
这可能是一个开始:
awk -F'=' -v section="[efgh]" -v k="key1" '
$0==section{ f=1; next } # Enable a flag when the line is like your section
/\[/{ f=0; next } # For any lines with [ disable the flag
f && $1==k{ print $0 } # If flag is set and first field is the key print key=value
' ini.file
Run Code Online (Sandbox Code Playgroud)
你传递两个变量,section和k。section需要包含您要查看的部分。k应该包含key您试图获取的价值。
查找key1下部分的值[efgh]:
$ awk -F'=' -v section="[efgh]" -v k="key1" '
$0==section{ f=1; next }
/\[/{ f=0; next }
f && $1==k{ print $0 }
' ini.file
key1=c
Run Code Online (Sandbox Code Playgroud)
查找key2下部分的值[hijk]:
$ awk -F'=' -v section="[hijk]" -v k="key2" '
$0==section{ f=1; next }
/\[/{ f=0; next }
f && $1==k{ print $0 }
' ini.file
key2=f
Run Code Online (Sandbox Code Playgroud)
使用 sed
sed -r ':a;$!{N;ba};s/.*\[efgh\][^[]*(key1=[^\n]*).*/\1/' file
key1=c
Run Code Online (Sandbox Code Playgroud)
其它的办法
sed -nr '/\[efgh\]/,/\[/{/key1/p}' file
Run Code Online (Sandbox Code Playgroud)