正则符号与通配符
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的属性,第二个命令能正确打印abc和adc这两行,但是第三个命令输出为空。这里面涉及到三个东西:通配符,基础正则表示符,扩展正则标识符。
通配符
*:代表任意数量的任意字符
?:代表任意一个字符
[]:代表括号里的任意一个字符
[-]:代表括号里表示的字符范围里的一个字符
[^]:代表只要不是括号里的字符的任何一个字符
栗子:
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