如何在单行文本上找到正则表达式后面的字符串?

如何在单行文本上找到正则表达式后面的字符串?

我有一个包含很长行 JSON 数据的文本文件,我需要提取某些字段的值。我意识到最简单的方法是使用jqor 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 兼容的正则表达式

相关内容