最近我在使用正则表达式做家务时遇到了以下情况.
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\]]
Run Code Online (Sandbox Code Playgroud)
为什么我在最后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\]]
Run Code Online (Sandbox Code Playgroud)
那个输出是:
[b]
[b]
[b]
[b]
[b]
Run Code Online (Sandbox Code Playgroud)
在[这些实施例中(在回送数据)的存在出于美容的原因; 它可以省略,并且可以接受这些行.
| 归档时间: |
|
| 查看次数: |
29 次 |
| 最近记录: |