在 JQ 上应用正则表达式



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

我有这个字符串

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

我想从任务/中获取子字符串,然后返回blablabla

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

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

这给了我两组。

知道如何使用 jq 应用此正则表达式并获得第二组吗?

问候

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

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

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

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

处理输入字符串不包含":task/"的情况,例如使用test/1过滤:

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

还请考虑使用命名捕获组:

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

等。

在你的 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/~~'
json_string='"arn:aws:ecs:eu-west-1:foo:task/blablabla"'
jq 'match("^(.*task?)/(.*$)", .) | .captures[1].string | select(.)' <<<"$json_string"

。作为输出发出:

"blablabla"

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

相关内容

  • 没有找到相关文章

最新更新