Regex 使用grep-oP提取字符串

Regex 使用grep-oP提取字符串,regex,jenkins,grep,sudo,Regex,Jenkins,Grep,Sudo,试图从字符串中提取子字符串时,变量IMAGE\u标记中出现空字符串:R8A144: 加载的图像:rcsmw ee:R8A144 通过Jenkins execute shell中的grep-oP: 代码如下: ssh -o "StrictHostKeyChecking=no" -o UserKnownHostsFile=/dev/null eccd@${DIRECTOR_IP_NUM} ' LOADED_IMAGE=$(sudo su root -c "docker load -i rcsmw-e

试图从字符串中提取子字符串时,变量
IMAGE\u标记中出现空字符串
:R8A144
: 加载的图像:
rcsmw ee:R8A144
通过Jenkins execute shell中的
grep-oP

代码如下:

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
是多余的,您可以删除模式中的括号并使用

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:]_]*")

注意
-m1
grep
将只提取第一个匹配项,这似乎是您在这里要做的。

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

另外,
“$LOADED_IMAGE”
最好用双引号引起来,因为如果它包含空格,可能会引起问题

此外,与捕获组一样,
A-Z
之后的
A
是多余的,您可以删除模式中的括号并使用

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:]_]*")

注意
-m1
grep
将只提取第一个匹配项,这似乎是您在这里要做的。

另一个解决方案是使用ssh和标记,如下所示:
ssh-o“StrictHostKeyChecking=no”-o UserKnownHostsFile=/dev/null eccd@${DIRECTOR\u IP\u NUM}另一种解决方案是使用带标记的ssh,如下所示:
ssh-o“StrictHostKeyChecking=no”-o UserKnownHostsFile=/dev/null eccd@${DIRECTOR_IP_NUM}
IMAGE_TAG=$(echo$LOADED_IMAGE | grep-oP'(:[A-ZA])\w+)
在我的bash上运行良好。这个错误似乎是詹金斯特有的。你想用这个标签做什么?我需要得到R8A144,然后创建一个新的特定标签。你也可以试试awk。IMAGE_TAG=$(echo$LOADED_IMAGE | awk-F':''{print$2}')awk:cmd。第1行:{print awk:cmd.第1行:^意外换行或字符串结尾try
IMAGE\u-TAG=$(echo“$LOADED\u IMAGE”| grep-oP-m1:[A-Z]\w*”
IMAGE\u-TAG=$(echo$LOADED\u IMAGE | grep-oP'(:[A-ZA])\w+)
在我的bash上运行良好。错误似乎是jenkins特有的。你想用这个标记做什么?我需要得到R8A144,然后创建一个新的特定标记。你也可以尝试awk。IMAGE_tag=$(echo$LOADED_IMAGE|awk-F':“{print$2}”)awk:cmd。行:1:{print awk:cmd.line:1:^意想不到的换行符或字符串末尾try
IMAGE\u TAG=$(echo“$LOADED\u IMAGE”| grep-oP-m1:[A-Z]\w*”
我不认为
“:[A-Z]\w*”
中的反斜杠会传递给grep…@ruakh在单引号中包含单引号的一种合理方便的方法是
(它结束单引号,添加一个只包含
”的双引号字符串,并开始一组新的单引号)。IMAGE_TAG=$(echo“$LOADED_IMAGE”| grep-oP-m1:[a-Z]\w*”)有效。谢谢!啊,对不起,你是对的--per,“在双引号中,没有特殊含义的反斜杠[…]前面的字符保持不变。”我不认为
“:[A-Z]\w*”
中的反斜杠会传递给grep…@ruakh在单引号中包含单引号的一种合理方便的方法是
“””
(它结束单引号,添加一个只包含
的双引号字符串,并开始一组新的单引号)“$LOADED_IMAGE”| grep-oP-m1:[A-Z]\w*”)有效。谢谢!啊,对不起,你是对的--per,“在双引号内,没有特殊含义的反斜杠[…]前面的字符将保持不变。”