正则表达式
先说说正则表达式的含义,正则表达式是一种模板,数据如果匹配模板,他就可以进行下一步的处理,不匹配就会过滤掉。
正则表达式的类型
锚字符
- 锁定在行首(^),(^)定义数据流文本从行首开始的模式,例如,
echo "the book store" | sed -n '/^book/p'
则匹配不到 - 注意,如果将^号放在模式开头的其他位置,那么他就和普通字符一样了,不再是特殊字符了
- 锁定在行尾($),($)与锁定在行首的规则一样
点号字符
- 点号用来匹配出换行符之外的任意单个字符,他必须匹配一个字符,如果没匹配上,则模式就不成立了
sed -n '/.at/p' data
字符组
字符组可以定义用来匹配文本模式中某个位置的一组字符,如果字符组中的某个字符出现在数据流中,则算是匹配上了
sed -n '/[ch]at/p' data6
echo "yeS" | sed -n '/[Yy][Ee][Ss]/p'
排除型字符组
- 排除型,意思是寻找组中没有的字符,操作是在字符组前面加一个脱字符(^)
sed -n '/[^ch]at/p' data6
区间
- 单破折号(-)在字符组中可以表示区间的意思,只需要指定区间的第一个字符和最后一个字符就好了
sed -n '/^[0-9][0-9][0-9][0-9][0-9]$/p' data8
:每个字符组都会匹配0到9的数字- 还可以在单个字符组中指定多个不连续的区间:
sed -n '/[a-ch-m]at/p' data6
:允许出现a到c,h到m的字母出现在at前
- 还可以在单个字符组中指定多个不连续的区间:
星号
- 在字符后面放置星号,表明该字符必须在匹配模式中出现0次或多次。
echo "ik" | sed -n '/ie*k/p'
扩展正则表达式
扩展表达式提供了一个额外的功能和符号,gawk可以识别,但是sed编辑器无法识别
问号
- 问号表明前面的字符可以出现0次或一次,但是他不会匹配多次出现的字符
echo "bt" | gawk '/be?t/{print $0}'
加号
- 加号表明前面的字符可以出现1次或者多次,至少出现一次
echo "beet" | gawk '/be+t/{print $0}'
花括号
- 花括号允许你为可重复的正则指定一个上限,可以两种格式来指定
- m:正则表达式准确出现m次
- m,n:正则表达式至少出现m次,至多n次
- 注意:默认情况gawk不识别间隔,需要指定–re interval
echo "bt" | gawk --re-interval '/be{1}t/{print $0}'
管道符号
- 管道符号允许在检查数据流时,用or的方式指定正则表达式引擎要用的两个或者多个模式。任意一个匹配上,则通过测试
- 使用的方式:expr|expr2
echo "The cat is asleep" | gawk '/cat|dog/{print $0}'
- 需要注意的是,正则表达式和管道之间是不能有空格的,
表达式分组
- 正则表达式可以使用圆括号进行分组,将正则表达式分组时,该组会被视为一个标准字符,可以像普通字符一样,给这个组使用特殊字符
echo "cab" | gawk '/(c|b)a(b|t)/{print $0}'
总结以上的规则如下表
正则表达式 | 描述 | 示例 |
---|---|---|
^ | 行起始标记 | ^app匹配以app开头的文本 |
$ | 行尾标记 | le$匹配以le结尾的文本 |
. | 匹配任意一个字符 | ap.le只能i匹配apple不能匹配appple |
[] | 匹配包含在[字符]中的任意一个字符 | coo[kl] 匹配cook或者cool |
[^] | ^脱字符,取反 | 9[ ^1]匹配除了91以外得值 |
[-] | 匹配[]中指定范围中的任意一个字符 | [1-5]1到5之间的任意一个字符 |
? | 匹配之前的项1次或者0次 | colou?r匹配color或者colour |
+ | 匹配之前的项1此或者多次 | model+,匹配modell或者modellll,不能匹配model |
* | 匹配之前的项0次或者多次 | co*l,匹配cl,col,coool等 |
() | 匹配一个用于匹配的子串 | ma(tri)?匹配max或者maxtrix |
{n} | 匹配之前的项n次 | [0-9]{3} 任意匹配三位数,等同于[0-9] [0-9] [0-9] |
{n,} | 至少匹配n次 | |
{n,m} | 匹配n到m次 | |
| | 交替-匹配|两边的任意一项 | act(lst|2nd) 匹配octlst或者act2nd |
\ | 转义符可以对上面的的特殊字符进行转义, | a\ .b匹配a.b但是不能匹配ajb. |
扩展的规则
- POSIX字符类是形如[:..:]的特殊元字符,规律如下
正则表达式 | 描述 |
---|---|
[::alnum:] | 字母与数字字符 |
[:alpha:] | 字母字符包括大小写字母 |
[:blank:] | 空格与制表符 |
[:digit:] | 数字字符 |
[:lower:] | 小写字母 |
[:upper:] | 大写字母 |
[:punct:] | 标点符号 |
[:space:] | 包括换行符,回车在内的所有空白字符 |