正则表达式
- 匹配行和单词
元字符是一个匹配行开头的锚
为了搜索那些以“Harley”开头的行,可以使用grep '^Harley' file
- 匹配行末尾的锚是元字符$
为了搜索那些以“Harley”结尾的行,使用grep 'Harley$' file
- 两个元字符结合使用
搜索整行就是一个单词为“Harley”的行,使用grep '^Harley$' file
查询空行,grep '^$' flle
- 匹配一个单词的开头和结尾
- 搜索以以字符串“kn”开头的单词,
grep '\<kn' file
,结尾单词为ow,grep 'ow>\'
- 搜索完整单词“know”,
grep '\<know\>' file
- 该命令可选取:
I know who you are,and I saw what you did
- 不选取:
Who knows what evil lurks in the hearts of men?
为了方便,可以使用\b作为\<和>的替代锚
- 搜索以以字符串“kn”开头的单词,
- 匹配字符
- 在正则表达式中,元字符 . 匹配任何单个字符,新行字符除外。
搜索一个单词,开头开头为“har”,后面跟随两个任意字符,在后跟一个字母“y”,使用grep 'har..y' file
- . 匹配的任意字符,而你希望匹配一个特定的字符。在这种情形下,可以通过将字符放在[]中来指定希望搜索到的字符。这样的结构就称为一个字符类
- 例如,搜索当前目录下的源文件中包含字母”D”开头后面跟着“o”或者“e”的文件。
ls | grep 'D[oe]'
,匹配结果Desktop Documents Downloads
- 例如,搜索当前目录下的源文件中包含字母”D”开头后面跟着“o”或者“e”的文件。
- 在正则表达式中,元字符 . 匹配任何单个字符,新行字符除外。
提示:理解复杂正则表达式的技巧就是记住每个字符类——不管它看上去是多么复杂——只表示一个单独的字符罢了。
- 预定义字符类:范围
有一些字符集是比较常见的,因此它们被冠以相应的名称,从而方面使用。这些字符集称为预定义字符类,以下为预定义字符类表
类 | 含义 | 类似于 |
---|---|---|
[:lower:] | 小写字母 | a-z |
[:upper:] | 大写字母 | A-Z |
[:alnum:] | 大小写字母 | A-Za-z |
[:digit:] | 数字 | 0-9 |
[:alnum:] | 大小写字母、数字 | |
[:punct:] | 标点符号 | - |
[:blank:] | 空白或制表符 | - |
预定义字符类的使用比较直接,但是使用是要加上双括号。例如:查询当前文件夹下包括数字的文件名,使用ls | grep [[:digit:]]
其效果和ls | grep [0-9]
作用相同。
7. 重复运算符
为了一次匹配多个字符,可以使用重复运算符
元字符 | 含义 |
---|---|
* | 一个*可以匹配前面字符的0次或多次的出现 |
+ | 匹配1个或多个字符 |
? | 匹配某个实例0次或1次 |
最后一个重复运算符,是通过方括号创建除所谓的限定来指定字符出现的次数。
形态 | 含义 |
---|---|
{n} | 正好匹配n次 |
{n,} | 至少匹配n次 |
{m,} | 最多匹配m次 [非标准,不属于POSIX1003.2B标准,可能在一些程序中无法使用] |
{n,m} | 至少匹配n次,最大匹配m次 |
到目前为止,我们只对单个的字符使用重复运算符。如果将多个字符用圆括号,也可以对多个字符使用重复运算符。这样的模式称为组。
例如:为了连续匹配字符串”xyz“5次,可以是哦那个下述两种正则表达式。xyzxyzxyzxyzxyz
或 (xyz){5}
最后一个重复运算符是 | 字符,它允许使用交变,也就是说可以匹配这一个,也可以匹配那一个。没研究出来,( ╯□╰ )。