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...
)。
要在以 开头的行末尾获取十六进制数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:]]+
表达式都将匹配一个非空的十六进制数字字符串。