正则表达式与 grep 命令
正则表达式是一种符号表示法,被用来识别文本模式。在某种程度上,它们与匹配文件和路径名的 shell 通配符比较相似,但其规模更大。许多命令行工具和大多数的编程语言都支持正则表达式,以此来帮助解决文本操作问题。
正则表达式元字符由以下字符组成:
^ $ . [ ] { } - ? * + ( ) | \ |
正则表达式 | 描述 | 示例 |
^ | 行起始标记 | ^shiyan匹配以shiyan起始的行 |
$ | 行尾标记 | $shiyan匹配以shiyan结尾的行 |
. | 匹配任意一个字符(除了换行符) | a.c匹配abc,aac,但不匹配abbc |
[ ] | 匹配包含在[字符]之中的任意一个字符 | ab[cd]匹配abc或abd |
[ ^ ] | 匹配除[^字符]之外的任意一个字符 | 1[^01]匹配12、13,但不匹配10,11 |
[ - ] | 匹配[ ]指定范围内的任意一个字符 | [1-5]匹配1-5的任意一个数字 |
{n} | 匹配之前的项n次 | [0-9]{2}匹配任意一个两位数,相当于[0-9][0-9] |
{n,} | 之前的项至少需要匹配n次 | [0-9]{2,}匹配任意一个两位或更多为的数字 |
{n,m} | 指定以前的项需要匹配的最小和最大次数 | [0-9]{2,5}匹配从两位数到五位数之间的任意一个数字 |
? | 匹配之前的项1次或者0次 | shiy?an匹配shiyan或shian |
* | 匹配之前的项0次或者多次 | shiy*an匹配shian、shiyan、shiyyan |
+ | 匹配之前的项1次或者多次 | shiy+an匹配shiyan、shiyyan |
() | 创建一个用于匹配的子串 | ma(in)?匹配ma或main |
| | 匹配 | 两边的任意一项 | Dec (1st | 2nd) 匹配 Dec 1st 或者 Dec 2nd |
\ | 将上面的特殊字符进行转义 | a\+b 匹配 a+b |
(1)常用范例
例一:利用 Linux 系统自带的字典查找一个五个字母的单词,第三个字母为 j,最后一个字母为 r ,/usr/share/dict 目录下存放字典文件,可以使用如下命令:
grep '^..j.r$' linux.words
例二:验证固定电话,打印符合条件的电话,固定电话格式基本都是带有 0 的区号+连接符“-”+电话号码,另外还有可能有分机号,区号有 3 位、4 位,电话号码有 7 位和 8 位的,可以使用如下命令:
grep "^0[0-9]{2,3}-[0-9]{7,8}(-[0-9]{3,4})?$" telphone.txt
区号:前面一个 0,后面跟 2-3 位数字 : 0[0-9]{2,3}
电话号码:7-8 位数字: [0-9]{7,8}
分机号:一般都是 3-4 位数字: [0-9]{3,4}
注意执行下面的命令时没有任何匹配输出,这是因为没有加-E 选项,那例一没加为什么可以呢,这是因为 grep 把.当成 shell 通配符,不是正则表达式的元字符。