使用 grep -oP 提取字符串

extract string with grep -oP

尝试从字符串中提取子字符串 :R8A144 时,变量 IMAGE_TAG 中的字符串为空: 已加载图片:rcsmw-ee:R8A144 通过 grep -oP 在 Jenkins 中执行 shell:

代码如下:

ssh -o "StrictHostKeyChecking=no" -o UserKnownHostsFile=/dev/null eccd@${DIRECTOR_IP_NUM} '
LOADED_IMAGE=$(sudo su root -c "docker load -i rcsmw-ee-5940688.4.tar")
IMAGE_TAG=$(echo $LOADED_IMAGE | grep -oP '\(:[A-ZA]\)\w+')
echo $IMAGE_TAG
'

这是输出:

bash: command substitution: line 5: syntax error near unexpected token `('
bash: command substitution: line 5: `echo $LOADED_IMAGE | grep -oP (:[A-ZA])w+)'
Error parsing reference: "rcsmw-ee:" is not a valid repository/tag: invalid reference format

您在单引号内有一整套命令,因此您不能在 grep 模式周围使用单引号。

此外,"$LOADED_IMAGE" 也最好用双引号引起来,因为如果它包含空格可能会造成麻烦。

此外,A-Z后的A是多余的,捕获组也是,你可以去掉pattern中的括号,使用

IMAGE_TAG=$(echo "$LOADED_IMAGE" | grep -oP -m 1 ":[A-Z]\w*")

或者,使用等效的 POSIX BRE 正则表达式:

IMAGE_TAG=$(echo "$LOADED_IMAGE" | grep -o -m 1 ":[[:upper:]][[:alnum:]_]*")

注意 -m 1grep 将只提取第一个匹配项,这似乎是你想要的。

另一种解决方案是使用带有标签的 ssh,如下所示: ssh -o "StrictHostKeyChecking=no" -o UserKnownHostsFile=/dev/null eccd@${DIRECTOR_IP_NUM} <<'SSHTAG' . IMAGE_TAG=$(echo $LOADED_IMAGE | grep -oP '(:[A-ZA])\w+') . . SSHTAG