在JQ上应用正则表达式

时间:2016-05-19 15:51:37

标签: regex bash jq

我正在使用jq来获取json并获得一些值。

我有这个字符串

   "arn:aws:ecs:eu-west-1:foo:task/blablabla"

我想从task /获取子字符串然后返回blablabla

现在我有这个正则表达式。

 (.*task?)\/(.*$)

这给了我两个小组。

任何想法如何使用jq我可以应用此正则表达式并获得第二组?

此致

4 个答案:

答案 0 :(得分:2)

在jq 1.5上,您可以将正则表达式传递给match,然后获取string第二个元素的captures属性。

jq 'match("(.*task?)\/(.*$)").captures[1].string'

答案 1 :(得分:2)

为什么不使用sub/2?例如(符合OP的正则表达式):

$ jq -r 'sub(".*task/"; "")' <<< '"arn:aws:ecs:eu-west-1:foo:task/blablabla"'
blablabla

处理输入字符串不包含&#34;:task /&#34;的情况可能更好。使用test/1进行过滤:

select(test(":task/")) | sub( ".*:task/"; "")

还考虑使用命名捕获组:

jq -r 'sub(".*:task/(?<x>.*)"; "\(.x)")' <<< '"arn:aws:ecs:eu-west-1:foo:task/blablabla"'
blablabla

答案 2 :(得分:1)

在BASH脚本中,您可以获取jq的输出并使用BASH字符串操作:

s='arn:aws:ecs:eu-west-1:foo:task/blablabla'
r="${s##*task/}"

# check output
echo "$r"
blablabla

${s##*task/}将从头开始删除最长的部分task/

或者您可以使用sed

jq '.selector' | sed 's~.*task/~~'

答案 3 :(得分:1)

json_string='"arn:aws:ecs:eu-west-1:foo:task/blablabla"'
jq 'match("^(.*task?)\/(.*$)", .) | .captures[1].string | select(.)' <<<"$json_string"

...作为输出发出:

"blablabla"

要将其作为原始字符串发出,不使用文字引号,请使用-r参数jq