将两个 grep 合并为一个

ste*_*toc 3 grep regular-expression

我需要从另一个命令的输出中提取一个 ID。目前我的提取命令如下所示:

someID=$(command | grep -oP '(?:^Successfully\sbuilt\s)([\da-z]{12}$)' | grep -oP '([a-z\d]{12})')
Run Code Online (Sandbox Code Playgroud)

示例命令输出:

 ---> Using cache
 ---> 9b4624927fa6
Successfully built 9b4624927fa6
Run Code Online (Sandbox Code Playgroud)

预期结果:

9b4624927fa6
Run Code Online (Sandbox Code Playgroud)

从行中提取的 ID

Successfully built 9b4624927fa6
Run Code Online (Sandbox Code Playgroud)

我怎样才能将这两个 grep 语句合并为一个?

mur*_*uru 10

grep对我的第一个作品稍作修改:

$ grep -oP '^Successfully\sbuilt\s\K[\da-z]{12}$' example-output
9b4624927fa6
Run Code Online (Sandbox Code Playgroud)

\K在 PCRE 中重置比赛开始:

转义序列\K导致任何先前匹配的字符不包含在最终匹配的序列中。

它类似于零宽度正后视断言 (?<=Successfully...)。

  • `\K` 不是断言的背后,它只是设置这里由 `-o` 报告的匹配文本的开始。比较`echo aaaaa | grep -Po 'a\K.'` 带有 `echo aaaaa | grep -Po '(?&lt;=a).'`(这次使用后视断言)。 (4认同)

Kus*_*nda 7

要在以 开头的行末尾获取十六进制数Successfully built,我可能会使用sed

sed -n -E 's/^Successfully built ([[:xdigit:]]+)$/\1/p'
Run Code Online (Sandbox Code Playgroud)

这将用散列替换匹配的行并打印它(没有其他行)。

或者awk

awk '/^Successfully built [[:xdigit:]]+$/ { print $NF }'
Run Code Online (Sandbox Code Playgroud)

这将打印与正则表达式匹配的每一行的最后一个以空格分隔的字段。

在这两个正则表达式中,[[:xdigit:]]+表达式都将匹配一个非空的十六进制数字字符串。