如何在Bash中不使用jq提取嵌套JSON的lastModifiedIn值
当然可以!不用jq,靠Shell自带的基础文本处理工具就能轻松提取出PHX。下面给你几个实用的方案,都是用默认自带的命令实现的:
先把你的目标JSON贴出来方便参考:
{"id": "Ab12", "details": "{\"timeValue\":null,\"lastModifiedIn\":\"PHX\"}", "version": 3}
方案1:grep + sed 组合
这个组合逻辑清晰,先定位目标字段,再提取值:
echo '{"id": "Ab12", "details": "{\"timeValue\":null,\"lastModifiedIn\":\"PHX\"}", "version": 3}' | grep -o '"lastModifiedIn":"[^"]*"' | sed 's/"lastModifiedIn":"\([^"]*\)"/\1/'
grep -o:只输出匹配到的部分,这里匹配"lastModifiedIn":"后面跟着任意非引号字符的内容sed:用正则捕获组把"lastModifiedIn":"和后面的引号去掉,只留下中间的PHX
方案2:纯sed实现
如果不想用多个命令,单靠sed也能完成:
echo '{"id": "Ab12", "details": "{\"timeValue\":null,\"lastModifiedIn\":\"PHX\"}", "version": 3}' | sed -n 's/.*"lastModifiedIn":"\([^"]*\)".*/\1/p'
-n:关闭sed默认的整行输出,只输出我们想要的内容- 正则里的
.*匹配字段前后的所有内容,用捕获组提取"lastModifiedIn":"和"之间的值,最后用p打印出提取的结果
方案3:awk实现
awk擅长处理字段分隔,这里用双引号做分隔符来定位目标值:
echo '{"id": "Ab12", "details": "{\"timeValue\":null,\"lastModifiedIn\":\"PHX\"}", "version": 3}' | awk -F'"' '{for(i=1;i<=NF;i++){if($i=="lastModifiedIn"){print $(i+2)}}}'
-F'"':把双引号设为字段分隔符- 遍历所有字段,当找到值为
lastModifiedIn的字段时,输出它后面第二个字段(因为结构是"lastModifiedIn":"PHX",分隔后PHX刚好在目标字段的下两个位置)
注意事项
这些方法都是基于你的JSON格式固定的前提,如果后续lastModifiedIn的值出现转义双引号、或者字段位置大幅变动,可能会失效。但针对你给出的这个场景,这些方案都能稳定输出PHX。
内容的提问来源于stack exchange,提问作者Akshay Salvi
相关产品推荐
相关产品推荐

