我正在尝试将一些行与包含数字的正则表达式进行匹配。
Bash版本3.2.25:
#!/bin/bash
s="AAA (bbb 123) CCC"
regex="AAA \(bbb \d+\) CCC"
if [[ $s =~ $regex ]]; then
echo $s matches $regex
else
echo $s doesnt match $regex
fi
结果:
AAA (bbb 123) CCC doesnt match AAA \(bbb \d+\) CCC
如果我放regex="AAA \(bbb .+\) CCC"
它有效,但它不符合我的要求,只匹配数字。
为什么\d+
不匹配123
?
答案 0 :(得分:44)
使用标准字符集或符合POSIX标准:
[0-9]
[[:digit:]]
正如Finding only numbers at the beginning of a filename with regex中所述:
\d
和\w
无法在POSIX regular expressions中使用,您可以使用[:digit:]
所以你的表达应该是以下之一:
regex="AAA \(bbb [0-9]+\) CCC"
# ^^^^^^
regex="AAA \(bbb [[:digit:]]+\) CCC"
# ^^^^^^^^^^^^
总之,你的脚本可以是这样的:
#!/bin/bash
s="AAA (bbb 123) CCC"
regex="AAA \(bbb [[:digit:]]+\) CCC"
if [[ $s =~ $regex ]]; then
echo "$s matches $regex"
else
echo "$s doesn't match $regex"
fi
让我们运行它:
$ ./digits.sh
AAA (bbb 123) CCC matches AAA \(bbb [[:digit:]]+\) CCC
答案 1 :(得分:7)
数字表示法\d
不适用于您的bash版本。请改用[0-9]
:
regex="AAA \(bbb [0-9]+\) CCC"