从 ini 文件的某个部分读取某个键(sed/awk ?)

TSG*_*TSG 6 awk ini sed file

我需要从具有典型结构的 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 可以做到这一点,但我找不到它...

jay*_*ngh 5

这可能是一个开始:

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)

你传递两个变量,sectionksection需要包含您要查看的部分。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)


BMW*_*BMW 5

使用 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)