正则符号与通配符

2019-10-16  本文已影响0人  ElephantKing

从两个简单的命令说开去

*****a.txt begin*****
** abc
** adc
** ac
****a.txt end*****
ls a?txt
grep a.c a.txt
grep a?c a.txt

上面的第一个命令,能正确显示文件a.txt的属性,第二个命令能正确打印abcadc这两行,但是第三个命令输出为空。这里面涉及到三个东西:通配符,基础正则表示符,扩展正则标识符。

通配符

*:代表任意数量的任意字符
?:代表任意一个字符
[]:代表括号里的任意一个字符
[-]:代表括号里表示的字符范围里的一个字符
[^]:代表只要不是括号里的字符的任何一个字符

栗子:
ls *.txt
ls [abc].txt
ls [a-z].txt
ls [^0-9].txt

基础正则表示符

^:一行的开头
$:一行的结尾
.:任何一个字符
\:跳脱字符,将特殊字符变为普通字符,使其失去特殊的意义
*:重复前一个字符的任意次,不能单独使用
[]:括号里的任意一个字符
[-]:括号里表示的字符范围里的任意一个字符
[^]:不是括号里表示的字符范围的任意字符
\{n,m\}:前一个字符的若干次重复

栗子:
grep ^abc a.txt        abc开头的行
grep abc$ a.txt        abc结尾的行
grep a.c a.txt         ac之间带任意字符的行
grep a\$c a.txt        a$c的行
grep a*c a.txt         a重复任意次后跟c的行

扩展正则表示符

+:前一个字符至少一次的重复
?:前一个字符0个或1个
|:表示或
():找出群组
()+:群组重复任意次

一个重要的原则

如果一个命令支持基础正则或扩展正则,那么该命令使用的符号一律被认为是正则语法,而不被当做是通配符,否则命令中的字符将被当做通配符处理。
回到开头的三个例子
ls a?txt:ls不支持正则语法,所以这里的符号'?'就是一个统配符,表示任意一个字符,所以能检索出a.txt这个文件。
grep a.c a.txt:默认只支持基础正则,所以这里能打印出任意ac之间包含一个字符的行(abc,adc..)。
grep a?c a.txt:因为字符'?'是扩展正则里的,所以grep命令默认不支持,而把它当做一个普通字符,所以该命令只能打印出包含a?c的行,如果要打印包含任意个字符a后面紧跟一个字符c的行,需要让命令grep支持扩展正则,命令该写成:grep -E a?c a.txt

哪些命令支持正则

支持通配符:ls、cat、cp、mv、rm
支持基础正则:grep、sed
支持扩展正则:grep -E、sed -r、egrep、awk
上一篇 下一篇

猜你喜欢

热点阅读