在 JQ 上应用正则表达式
Apply regex on JQ
我正在使用 jq 获取 json 并获取一些值。
我有这个字符串
"arn:aws:ecs:eu-west-1:foo:task/blablabla"
我想从 task/ 中获取子字符串,然后 return blablabla
现在我有了这个正则表达式。
(.*task?)\/(.*$)
哪个给我两组。
知道如何使用 jq 应用此正则表达式并获得第二组吗?
此致
在您的 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"
要将其作为原始字符串发出,不带文字引号,请使用 jq
的 -r
参数。
在 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
等等
我正在使用 jq 获取 json 并获取一些值。
我有这个字符串
"arn:aws:ecs:eu-west-1:foo:task/blablabla"
我想从 task/ 中获取子字符串,然后 return blablabla
现在我有了这个正则表达式。
(.*task?)\/(.*$)
哪个给我两组。
知道如何使用 jq 应用此正则表达式并获得第二组吗?
此致
在您的 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"
要将其作为原始字符串发出,不带文字引号,请使用 jq
的 -r
参数。
在 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
等等