53

我正在尝试将一些行与包含数字的正则表达式进行匹配。

重击版本 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

4

2 回答 2

90

使用标准字符集或符合 POSIX 的表示法:

[0-9]    
[[:digit:]]    

如在使用 regex 查找文件名开头的数字中所述

\d并且\w不能在POSIX 正则表达式中工作,你可以[: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
于 2013-07-31T10:39:15.077 回答
8

数字表示法\d不适用于您的 bash 版本。改用[0-9]

regex="AAA \(bbb [0-9]+\) CCC"
于 2013-07-31T10:36:59.100 回答