有问题让RegEx在bash脚本中工作。条件永远不会过去

时间:2017-07-24 02:56:23

标签: regex bash

我有一个简单的脚本,如果$ Msg不以" TST - "开头,则应返回错误消息接着是一些数字,后跟一个空格。我知道正则表达式是有效的,因为我从一个ruby脚本中获取它,它表现得像我预期的那样。

我有以下代码块,但我不明白为什么它没有按照我的预期行事。我已经阅读了类似问题的许多其他答案,但它们似乎都没有解决我的问题。

#!/bin/bash

Msg="TST-3 test string"
#regEx="^TST-\d+\s.*"
if [[ ! $Msg =~ ^TST-\d+\s.* ]]; then
    echo >&1 "Message must begin with TST-XXXX followed by a space"
    exit 1
fi

$ Msg设置为" TST-3测试字符串"但它仍然会返回错误消息,我真的不知道为什么。

任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:2)

问题是bash不支持\d\s运算符分别表示数字和空格。

您需要对数字使用[0-9](或[:digit:]表示locale依赖项),对任何水平空格使用字符类[:blank:]或对任何水平空格使用[:space:]一种空格(或者写出自己想要的空格的字符类)。

$ Msg="TST-3 test string"
$ [[ ! $Msg =~ ^TST-[[:digit:]]+[[:blank:]] ]] && echo 'No Match' || echo 'Match'
Match

此外,空白匹配后的.*是多余的,您可以删除它。

答案 1 :(得分:1)

\d\s不可用。

Msg="TST-3 test string"
regEx="^TST-[0-9]+ .*"
if [[ ! "${Msg}" =~  ${regEx}  ]]; then
    echo >&1 "Message must begin with TST-XXXX followed by a space"
    exit 1
fi