Grep PCRE 正则表达式非捕获组

swe*_*ere 2 regex awk grep

我希望从以下文本中提取以下两个字符串:

ip-10-x-x-x.eu-west-2.compute.interna

topology.kubernetes.io/zone=eu-west-2a

完整斑点:

ip-10-x-x-x.eu-west-2.compute.internal   Ready    <none>   18d   v1.20.4-eks-1-20-1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/os=linux,node.app/name=all,topology.kubernetes.io/region=eu-west-2,topology.kubernetes.io/zone=eu-west-2a
Run Code Online (Sandbox Code Playgroud)

使用带有 Grep PCRE 的正则表达式来提取字符串。

以下正则表达式适用于https://regex101.com/

(((^ip.*?)(?=(\s)))(?:.*?)((?<=\,)(topology\.kubernetes\.io\/zone.*?)(?=(\s|$))))
Run Code Online (Sandbox Code Playgroud)

但是当使用 Grep 在 Bash v4.2 上运行时,它会返回完整的 blob,而不是正则表达式组,如下所示:

echo "ip-10-x-x-x.eu-west-2.compute.internal   Ready    <none>   18d   v1.20.4-eks-1-20-1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/os=linux,node.app/name=all,topology.kubernetes.io/region=eu-west-2,topology.kubernetes.io/zone=eu-west-2a" | grep -oP "(((^ip.*?)(?=(\s)))(?:.*?)((?<=\,)(topology\.kubernetes\.io\/zone.*?)(?=(\s|$))))"
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?

tsh*_*ono 5

正如 Barmer 评论的那样,grep不引用捕获组。您需要修改正则表达式才能与 grep 一起使用:

echo "ip-10-x-x-x.eu-west-2.compute.internal   Ready    <none>   18d   v1.20.4-eks-1-20-1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/os=linux,node.app/name=all,topology.kubernetes.io/region=eu-west-2,topology.kubernetes.io/zone=eu-west-2a" | grep -oP "^ip\S+|(?<=\,)topology\.kubernetes\.io\/zone\S*(?=(?:\s|$))"
Run Code Online (Sandbox Code Playgroud)

输出:

ip-10-x-x-x.eu-west-2.compute.internal
topology.kubernetes.io/zone=eu-west-2a
Run Code Online (Sandbox Code Playgroud)

如果您想按原样使用正则表达式,请尝试ripgrep

echo "ip-10-x-x-x.eu-west-2.compute.internal   Ready    <none>   18d   v1.20.4-eks-1-20-1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/os=linux,node.app/name=all,topology.kubernetes.io/region=eu-west-2,topology.kubernetes.io/zone=eu-west-2a" | rg --pcre2 "(((^ip.*?)(?=(\s)))(?:.*?)((?<=\,)(topology\.kubernetes\.io\/zone.*?)(?=(\s|$))))" -r '$2'$'\n''$5'
Run Code Online (Sandbox Code Playgroud)

这会产生相同的结果。