在编写shell脚本时,如何在单个行字符串中提取特定键的所有值,这是一个元组列表?例如,我的字符串是:
[{"key1":"value1", "key2":"value2"},{"key1":"val1","key2":"val2"}]
,输出应该是包含value1
和val1
的数组。
答案 0 :(得分:1)
这比使用真正的解析器要脆弱得多,所以你很可能会发现从长远来看下载jq
可能是值得的,但如果你只想使用grep,那么你就是在Ubuntu上你应该有GNU grep并且可以对你给出的字符串执行以下操作:
grep -Po 'key1":"\K[^"]+'
使用-P
使用Perl样式的正则表达式,-o
仅显示匹配的部分。我们在模式中添加\K
,以便它之前的所有内容都不会被计为匹配的一部分。
因此,根据您的输入,我执行以下操作:
$ printf '[{"key1":"value1", "key2":"value2"},{"key1":"val1","key2":"val2"}]' | grep -Po 'key1":"\K[^"]+'
value1
val1
将此与实际了解JSON的jq
进行比较:
jq '[ .[] | .["key1"] ]'
输出:
[
"value1",
"val1"
]
答案 1 :(得分:1)
根据您向我们展示的示例,基于对输入所包含内容的一系列假设,这是一种脆弱的方法:
$ awk -F'[":]+' -v k="key1" '{for (i=2;i<=NF;i+=3) if ($i==k) print $(i+1)}' file
value1
val1