最近我在使用正则表达式做家务时遇到了以下情况.
s@ubuntu:~$ echo b | egrep []b] b s@ubuntu:~$ echo b | egrep [[b] b s@ubuntu:~$ echo b | egrep []b[] b s@ubuntu:~$ echo b | egrep [b[] b s@ubuntu:~$ echo b | egrep [[b]] s@ubuntu:~$ echo b | egrep [b]] s@ubuntu:~$ echo b | egrep [b\]] s@ubuntu:~$ echo b | egrep [b\\]] s@ubuntu:~$ echo b | egrep [\[b\]]
为什么我在最后5个案例中没有打印'b'?
egrep [[b]]
- 寻找a b
或[
后跟a ]
; 未找到.
egrep [b]]
- 寻找a b
后跟a ]
; 未找到.
egrep [b\]]
- 寻找a b
后跟a ]
; 未找到.shell省略了反斜杠,但没有看到egrep
.
egrep [b\\]]
- 查找b
后面跟着的反斜杠]
; 未找到.
egrep [\[b\]]
- 寻找a b
或a [
后跟]
; 未找到.shell省略了反斜杠,但没有看到egrep
.
在一个字符类(由...开头[
)中,第一个]
终止该类,除非它]
是在第一个字符之后[
,或者在[^
一个否定字符类之后的第一个字符.请注意,这]
不是正则表达式元字符,除非前面[
的字符串使其成为字符类的末尾.您还发现它$
不是字符串中间的元字符,也不是^
它出现在开头,也不*
是+
也不?
是它们首先出现等.请参阅POSIX 正则表达式进行详细讨论 - 由egrep
(现在grep -E
)处理的正则表达式是'扩展正则表达式'.
在egrep
获得有机会看到它们之前,外壳会用反斜杠混乱.你应该用单引号括起你的正则表达式,以避免shell改变egrep
看到的内容.
您可以通过更改回显的内容来演示我的分析:
echo '[b]' | egrep [[b]] echo '[b]' | egrep [b]] echo '[b]' | egrep [b\]] echo '[b]' | egrep [b\\]] echo '[b]' | egrep [\[b\]]
那个输出是:
[b] [b] [b] [b] [b]
在[
这些实施例中(在回送数据)的存在出于美容的原因; 它可以省略,并且可以接受这些行.