解析来自不同 JSON 字符串的值(无 jq)

解析来自不同 JSON 字符串的值(无 jq)

我正在使用 bash 脚本,该脚本需要读取 JSON 输出并解析来自不同 JSON 变量或字符串的值。这是示例输出。它需要读取任何其他变量旁边Content或来自任何其他变量的值。例如,

查找Content并能够打印Value1

查找DeviceType并能够打印Value4

样本输出: {"Content":"Value1","CreationMethod":"Value2","database":"Value3","DeviceType":"Value4"}

我尝试了 sed 和 awk 的组合sed 's/["]/ /g' | awk '{print $4}',但前提是 的位置Content在输出中保持相同。否则,在不同的 JSON 输出中,Content使值超出范围的更改定位会awk '{print $4}'拾取错误的值。

答案1

好吧,如果我理解正确的话,使用 GNUgreptr

tr ',' '\n' < foo | grep -Po "(?<=Content\":\").*(?=\")"

输出:

Value1

与其他关键字:

tr ',' '\n' < foo | grep -Po "(?<=database\":\").*(?=\")"

Value 3

替换新行的逗号:

tr ',' '\n'

Grep-o仅限-PPerl,如正则表达式

grep -Po

捕捉图案("<keyword>:"")<value>(")并打印仅有的 <value>

答案2

jq越来越perl少的大锤使用OP的意图sed/awk

s="Content"; sed 's/[{}"]//g' file | awk -v s=$s -F ":" -v RS=',' '($1 == s) {print $2}'

答案3

好吧,我承认这很糟糕……

$ awk 'BEGIN {FPAT="\"[^\"]+\""; RS=","; pat=ARGV[1]; delete ARGV[1]} 
     $1 ~ pat {print $2} '       Content ex.json
"Value1"

答案4

$ jq -r '.Content' file
Value1
$ jq -r '.DeviceType' file
Value4

没有理由不安装jq来正确、安全地解析 JSON,并且无需关心手动解码 JSON 编码的字符串等。

实用性jq可供下载以不需要 root 权限的形式安装在您的主目录中(无外部运行时依赖项)。

相关内容