使用bash获取json的值

使用bash获取json的值,json,regex,bash,escaping,Json,Regex,Bash,Escaping,我有一个json文件,其结构如下 { "tool_first":"1.1.1","tool_second":"2.2.2","tool_three":"3.3.3" } 我想用bash-grep从中检索版本。我创造了这样的东西 cat myjson.json | grep -Po '"tool_second":\K"[A-Za-z0-9/._]*"' 这给了我输出 "2.2.2" 如何使用变量代替字符串“tool_second”?我想要像这样的东西 cat myjson.json | gr

我有一个json文件,其结构如下

{ "tool_first":"1.1.1","tool_second":"2.2.2","tool_three":"3.3.3" }
我想用bash-grep从中检索版本。我创造了这样的东西

cat myjson.json | grep -Po '"tool_second":\K"[A-Za-z0-9/._]*"'
这给了我输出

"2.2.2"
如何使用变量代替字符串“tool_second”?我想要像这样的东西

cat myjson.json | grep -Po '"$x":\K"[A-Za-z0-9/._]*"'
其中$x是变量;x=“工具秒”。我无法使用变量从中检索信息。如何以这种方式正确地转义变量?我只需要版本号,没有“”

grep
不是解析
JSON
文本的正确工具。使用更具语法意识的工具,如
jq
。下面的答案仅用于琐碎的目的

您没有转义字符串中的双引号以搜索变量
x
中的当前值

x="\"tool_second\""
grep -Po "$x:\K\"[A-Za-z0-9/._]*\"" file
"2.2.2"
它也可以用于其他字符串

x="\"tool_first\""
grep -Po "$x:\K\"[A-Za-z0-9/._]*\"" file
"1.1.1"

为什么要用
grep
解析
JSON
文本?使用一个了解底层格式的解析器,比如
jq
我知道我可以使用jq,但我想不用jq来解析。但是为什么呢?将grep与jq版本进行比较:
jq--arg x tool_second.[$x]'myjson.json
。您在这里引用的是谁/什么?它不起作用。在最好的情况下,它会给我所有值的列表。@Tatarino:您的输入json对我来说很好,您能发布您正在测试的实际文件吗?