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行:^意外换行或字符串结尾tryIMAGE\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:^意想不到的换行符或字符串末尾tryIMAGE\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,“在双引号内,没有特殊含义的反斜杠[…]前面的字符将保持不变。”