【问题标题】:Regex Bash to match a condition正则表达式 Bash 以匹配条件
【发布时间】:2018-06-08 08:16:45
【问题描述】:

我希望匹配以下模式,然后在 Jenkins 中继续编写 shell 脚本。字符串应始终以 CMR- 和 SP- 开头,后跟 4 个数字,如下所示。我在将此案例与 0-9 范围内的 4 个数字匹配时遇到问题。任何语言都可以。

所以我的目的是这样的。我想根据以下条件运行脚本。如果环境与生产环境不匹配 xyz 并且与票证 ID 不匹配,例如 CMR-1234 或 SP-1234,则脚本应该退出并且不运行我的部署脚本。

有人可以帮帮我吗?

CMR-1256 和 SP-1278

我的 bash 表达式如下所示。

end () {

exit 1

}

echo $CMR


if [ ! `echo $CMR | grep -cE "^CMR-{0,9}|^SP-{0,9}" ` -gt 0 -a $environment == "xyz" ]

then

echo "None of the conditions met"
   end 

  fi

我刚刚修改了我的问题以使其更加清晰。

【问题讨论】:

  • 四位数模式是 [0-9]{4}(ERE 和 NFA)或 [0-9]\{4\}(BRE)。我不知道你要使用什么。将其视为提示。
  • 感谢您的提示。但是,它没有按预期工作。我在 grep 条件下使用了 grep -cE "^CMR-[0-9]{4}|^SP-[0-9]{4}" 但即使使用 CMR-123455,我的脚本仍在继续。我希望它仅限于 CMR-5432(4 个字符)。我也尝试了其他评论。
  • 问题是! 的优先级吗?你能澄清-a $environment == "xyz"的目的吗?前面的! 会将其更改为!=。顺便说一句,您评论中的 RE 与您的问题中显示的 RE 不同。并且,您想要正好 4 位还是最多 4 位?
  • 所以我的目的就是这个。我想根据以下条件运行脚本。如果环境与生产环境不匹配 xyz 且与票证 ID 不匹配,例如 CMR-1234 或 SP-1234,则脚本应退出且不运行我的部署脚本。
  • @cdarke 我的要求是 CMR- 或 SP- 之后的 4 位数字,并且应该始终是一个数字。

标签: python regex shell if-statement


【解决方案1】:

试试这个,它使用的是bash RE 而不是grep

#!/bin/bash

end () { exit 1; }

environment="xyz"

for CMR in CMR-1256 gash SP-1278
do
    echo $CMR

    if [[ ! $CMR =~ ^(CMR|SP)-[0-9]{4}$ ]] || [[ $environment != "xyz" ]]
    then
        echo "None of the conditions met in $CMR $environment"
        #end
    else
        echo "$CMR matched $environment"
    fi
done

给予:

CMR-1256
CMR-1256 matched xyz
gash
None of the conditions met in gash xyz
SP-1278
SP-1278 matched xyz

【讨论】:

  • 对不起,但这也行不通。当我将 5 个数字与 SP 或 CMR 一起传递时,它仍在工作。 end () { 退出 1;如果 [[ ! $CMR =~ ^(CMR|SP)-[0-9]{4} ]] || [[ $deployment_environment != "production" ]] 然后 echo "$CMR $environment 中没有满足条件" end else echo "$CMR 匹配 $environment" fi
  • 好的,我会解决的。 $ 添加在 RE 的末尾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
相关资源
最近更新 更多