在Linux中使用regex获取json值[重复]

ufj5ltwl  于 2023-02-01  发布在  Linux
关注(0)|答案(2)|浏览(107)
    • 此问题在此处已有答案**:

Parsing JSON with Unix tools(45个答案)
昨天关门了。
我有一个json文件file. json,如下所示:

{
  "abc": "123",
  "def": 456,
  "ghi": 789
}

我试图在bash终端中使用regex获取所有键的值。
下面是我为获得abc的值所做的尝试:

var=cat file.json
regex='(abc\":) \"(.+)\",'
[[ $var =~ $regex ]]
echo ${BASE_REMATCH[1]}

它不打印任何内容。我正在尝试获取/打印abc的值,即**"123"**
请注意我不能使用jq解析器。

wfveoks0

wfveoks01#

虽然通常建议使用Json解析器(* 不要做别人已经做得很好的工作 *),但有时通过正则表达式解析Json用于 * 使用和丢弃 * 脚本或解析非常简单的json文件/字符串(如您在输入中使用的)也是可以的
如果是这种情况,这个可能对你有用(只要值是标量)

var=$(cat file.json)
regex='"abc"[[:space:]]*:[[:space:]]*("([^"]+|\\")+"|[^[:space:],"]+)'

[[ $var =~ $regex ]]

if [[ $var =~ $regex ]]; then
  echo ${BASH_REMATCH[1]}
fi

对于任何其他情况,请使用JSON解析器。
Perl几乎安装在每种Linux风格上,JSON::PP模块应该是核心模块的一部分。
你可以这样做:

perl -MJSON::PP -E '$j=decode_json <>; say $j->{abc}' -0777 file.json
omhiaaxx

omhiaaxx2#

用python 3从stdin读取你的file.json。

    • 示例. py**:
import sys
import json

f = open(sys.stdin.fileno(), 'r')
data = json.load(f)

print(data[sys.argv[1]])
    • 用法**:python3 example.py 'abc' < file.json

输出:

123

相关问题