用grep -oP提取字符串

时间:2019-09-24 06:17:34

标签: regex jenkins grep sudo

当尝试从字符串中提取子字符串IMAGE_TAG时,变量:R8A144中的字符串为空: 载入的图片:rcsmw-ee:R8A144 由Jenkins中的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

2 个答案:

答案 0 :(得分:0)

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

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

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

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只会提取第一个匹配项,这似乎是您在此找到的匹配项。

答案 1 :(得分:0)

另一个解决方案是将ssh与以下标记一起使用: ssh -o“ StrictHostKeyChecking = no” -o UserKnownHostsFile = / dev / null eccd @ $ {DIRECTOR_IP_NUM} <<'SSHTAG' 。 IMAGE_TAG = $(回显$ LOADED_IMAGE | grep -oP'(:[A-ZA])\ w +') 。 。 SSHTAG