解析逗号分隔的"键:值"串

时间:2013-08-28 09:31:02

标签: bash

我有一个包含多个块的文本文件,其中有几行可能如下所示:

{ key1: value, key2: value,
  key3: value,
  key4: value, key5: value }

{ key1: value, key2: value, key3: value,
  key4: value, key5: value }

给定key,我如何获得所有相应的值? 请注意,键名和值都没有固定长度,块用大括号开头和结尾,对用逗号分隔。

我的第一次尝试是使用grepcut,但我无法获得所有密钥。我想这对于sedawk应该很容易,但是他们的语法让我很困惑。

3 个答案:

答案 0 :(得分:3)

使用grep的第一个解决方案:

grep -o 'key5: [^, }]*' file

显示如下内容:

key5: value
key5: value

删除密钥:

grep -o 'key5: [^, }]*' file | sed 's/^.*: //'

value
value

答案 1 :(得分:1)

这仅在键和值在同一行上时有效,并且如果键不包含在任何值中,则值和键不包含空格,逗号或冒号:

awk -F'[, :]+' '{for (i=1;i<NF;i++) if ($i=="key3") print $(i+1)}' file

或者如果您想要变量

中的键
awk -F'[, :]+' -v key="$key" '{for (i=1;i<NF;i++) if ($i==key) print $(i+1)}' file

答案 2 :(得分:1)

使用sedgrep

sed 's|[{},]|\n|g' your-file.txt | grep -Po '(?<=key1:).*$' 

sed将文件重新格式化为每行只有一对键值;然后使用带有lookbehind的grep来仅提取与指定键相关的值。