我有一个包含很长行 JSON 数据的文本文件,我需要提取某些字段的值。我意识到最简单的方法是使用jq
or grep -o
;但是,我在公司机器上,所以无法安装jq
,而且我们使用的 Solaris 版本grep
没有该-o
选项。目前我正在使用命令:
cat json.file |
tr "," "\n" |
awk '/customfield_10701/ { print $0 }' |
tr '"' "\n" |
awk 'NR==4'
上面的工作正常,但我不禁觉得它过于复杂,应该有一个更优雅的解决方案。
示例json.file
:
... jshdgfjhsdgfjh,"customfield_10701":"Some Branch","customfield_10702ksghdkfsdkfjkj ...
使用我当前的命令我得到:
Some Branch
(这就是我想要的)。
答案1
如果您确定要查找的数据中没有"
字符,并且文件中只有一行包含“customfield_10701”条目,则
sed -n 's/.*"customfield_10701":"\([^"]*\)".*/\1/p'
例如,
$ cat x
... jshdgfjhsdgfjh,"customfield_10701":"Some Branch","customfield_10702ksghdkfsdkfjkj ...
$ sed -n 's/.*"customfield_10701":"\([^"]*\)".*/\1/p' x
Some Branch
答案2
您不需要使用tr
将逗号转换为换行符。然后又回来了。您可以awk
使用逗号作为输入记录分隔符 ( RS
)。
awk -F':' -v RS=',' '/customfield_10701/ { gsub(/"/,"",$2); print $2 }' json.file
gsub()
用于"
从字段 2 中删除双引号(如果有)。
如果需要,您还可以使用gsub()
删除前导和尾随空格和制表符:
awk -F':' -v RS=',' '/customfield_10701/ {
gsub(/"|^[[:blank:]]+|[[:blank:]]+$/,"",$2);
print $2
}' json.file
请注意,当 RS 更改时,输出记录分隔符 ( ORS
) 不会自动更改,它会保持默认值(换行符),除非您设置它(例如使用-v ORS=','
)。
答案3
以下测试对我有用bash 3 内置正则表达式引擎并且不需要外部程序:
json='"jshdgfjhsdgfjh,"customfield_10701":"Some Branch","customfield_10702ksghdkfsdkfjkj"'
regex_hint=customfield_10701
[[ $json =~ $regex_hint\":\"(.+)\", ]] && printf '%s\n' "${BASH_REMATCH[1]}"
印刷:部分分行
'( )' 之间的正则表达式是“捕获组 1”,保存在“${BASH_REMATCH1}”
注意 bash 内置支持POSIX 扩展正则表达式而不是更广为人知的Perl 兼容的正则表达式