我有一个包含多个块的文本文件,其中有几行可能如下所示:
{ key1: value, key2: value,
key3: value,
key4: value, key5: value }
{ key1: value, key2: value, key3: value,
key4: value, key5: value }
给定key
,我如何获得所有相应的值?
请注意,键名和值都没有固定长度,块用大括号开头和结尾,对用逗号分隔。
我的第一次尝试是使用grep
和cut
,但我无法获得所有密钥。我想这对于sed
或awk
应该很容易,但是他们的语法让我很困惑。
答案 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)
使用sed
和grep
:
sed 's|[{},]|\n|g' your-file.txt | grep -Po '(?<=key1:).*$'
sed
将文件重新格式化为每行只有一对键值;然后使用带有lookbehind的grep
来仅提取与指定键相关的值。