为什么正则表达式 '[az][0-9]+$' 不起作用

为什么正则表达式 '[az][0-9]+$' 不起作用

我使用正则表达式来处理字符串“abc123”。下面的命令是工作并返回值“c123”

echo abc123 | grep -o [a-z][0-9]*$

但下面的命令不起作用。

echo abc123 | grep -o [a-z][0-9]+$

为什么我会得到这个结果?

我知道“*”用于匹配前面的模式元素零次或多次,“+”用于匹配前面的模式元素至少一次或多次。

所以这种情况让我很困惑。

答案1

+只是一个量词扩展正则表达式(ERE):

$ echo abc123 | grep -Eo '[a-z][0-9]+$'
c123

在基本正则表达式(BRE)中,它匹配文字+,尽管您可以使用\{1,\}它,或者在GNU grep(-o无论如何已经是GNU扩展)中,\+

$ echo abc123 | grep -o '[a-z][0-9]\+$'
c123

(注意引号以防止[\shell 解释)。

答案2

+grep中需要转义才能生效。代替

echo abc123 | grep -o [a-z][0-9]+$

你需要写

echo abc123 | grep -o '[a-z][0-9]\+$'

还有其他字符也需要转义。将正则表达式放在单引号中也是一个好习惯。

您还可以使用egrep它是扩展 RE 的同义词grep -E并使用扩展 RE,如@muru 所评论。

相关内容