0

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

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

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

给定 a key,我怎样才能得到所有相应的值?请注意,键名和值都没有固定长度,块以大括号开始和结束,对由逗号分隔。

我的第一次尝试是使用grepand cut,但我无法获得所有密钥。我想这应该很容易使用sedor awk,但它们的语法让我很困惑。

4

3 回答 3

4

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

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

显示类似:

key5: value
key5: value

要删除密钥:

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

value
value
于 2013-08-28T09:58:20.650 回答
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
于 2013-08-28T09:53:22.110 回答
1

使用sedgrep

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

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

于 2013-08-28T09:58:45.190 回答