使用 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 1
和 grep
将只提取第一个匹配项,这似乎是你想要的。
另一种解决方案是使用带有标签的 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
尝试从字符串中提取子字符串 :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 1
和 grep
将只提取第一个匹配项,这似乎是你想要的。
另一种解决方案是使用带有标签的 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