我有一个文件,内容如下:
{application_name, [
{settings, [
{generic_1, [
{key_1, "value"},
{key_2, 1},
{key_3, [something, other]}
]},
{generic_2, [
{key_1, "value"},
{key_3, [something, other]}
]},
{{generic_2, specific_1}, [
{key_3, [entirely, different]}
]},
]}
]}
现在我正在寻找一种使用awk或sed(或其他东西)解析它的方法。我需要的是能够指定一个键,然后得到" blockname"返回。
f.e。如果我希望key_3
的所有设置都返回如下:
generic_1 [something, other]
generic_2 [something, other]
specific_1 [entirely, different]
最好的方法是什么?
答案 0 :(得分:8)
如何使用sed或awk解析JSON数据的最佳解决方案是......不要使用sed或awk这样做。它们不是为它而设计的。
使用了解JSON的工具,如
在此基础上使用sed
或awk
这样的内容将会很脆弱(充其量)。
答案 1 :(得分:0)
我同意Etan的说法,这是另一种工具的工作
这是gnu awk
方法(由于RS中有多个字符),而不是完整的解决方案。
awk -v RS="generic_[0-9]" 'NR==1 {f=RT;next} {$1=$1;n=split($0,a,"[][]");if (a[1]~/}/) {split(a[1],b,"[ }]");f=b[2]};printf "%s [",f;for (i=1;i<=n;i++) if (a[i]~/key_3/) print a[i+1]"]";f=RT}' file
generic_1 [something, other]
generic_2 [something, other]
specific_1 [entirely, different]
或者更具可读性:
awk -v RS="generic_[0-9]" '
NR==1 {
f=RT
next}
{
$1=$1
n=split($0,a,"[][]")
if (a[1]~/}/) {
split(a[1],b,"[ }]")
f=b[2]}
printf "%s [",f
for (i=1;i<=n;i++)
if (a[i]~/key_3/)
print a[i+1]"]"
f=RT
}' file