我有一个简单的脚本,如果$ 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测试字符串"但它仍然会返回错误消息,我真的不知道为什么。
任何帮助将不胜感激。谢谢。
答案 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