我使用正则表达式来处理字符串“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 所评论。