正则表达式识别的特殊字符包括
*[]^${}\+?|()
锚字符
锁定在行首
脱字符^定义从数据流中文本行的行首开始的模式。要使用脱字符必须将它放在正则表达式中指定的模式的前面
echo "Book is great"|sed -n '/^Book/p'
如果将^放在模式中的其他位置而不是开头,它就会和普通字符一样。
锁定在行尾
美元符$定义了行尾的锚点。
组合锚点
用脱字符和美元符组合用来匹配完整的一行。如果中间不加任何字符,就是匹配空行。
点字符
点字符用来匹配任意的单字符,除了换行符。但点字符必须匹配一个字符,如果在点字符的位置没有字符,那么模式不成立。
cat data6
This is a test of a line.
The cat is sleeping.
That is the very nice hat.
This test is at line four
at ten O'clock we'll go home
$ sed -n '/.at/p' data6
The cat is sleeping.
That is the very nice hat.
This test is at line four -- 空格也是一个字符可以匹配到
字符组
要定义一个字符组,你要用方括号。
$ sed -n '/[ch]at/p' data6
The cat is sleeping.
That is the very nice hat.
排除字符组
字符组开头加个脱字符^可以匹配字符组中没有的任意字符。
$ sed -n '/[^ch]at/p' data6
This test is at line four
即便是排除,字符组仍然必须匹配一个字符,所以以at开头的行仍然未能匹配模式。
使用区间
[A-Za-z] # 大小写字母a b c ... z A B C ... Z
[0-9] # 数字0 1 2 ... 9
特殊字符组
组 | 描述 |
---|---|
[[:alpha:]] | 匹配任意字母字符,不管是大写还是小写 |
[[:alnum:]] | 匹配任意字母数字字符09、az、A~Z |
[[:blank:]] | 匹配空格或制表符 |
[[:digit:]] | 匹配0~9之间的数字 |
[[:lower:]] | 匹配小写字符a~z |
[[:print:]] | 匹配任意可打印字符 |
[[:punct:]] | 匹配标点符号 |
[[:space:]] | 匹配任意空白字符:空格、制表符、NL、FF、VT和CR |
[[:upper:]] | 匹配任意大写字母字符A~Z |
$ echo "abc"|sed -n '/[[:digit:]]/p'
$ echo "abc"|sed -n '/[[:alpha:]]/p'
abc
星号
在字符后面防止星号,说明该字符将会在匹配模式的文本中出现0次或者多次。
$ echo "ik"|sed -n '/ie*k/p'
ik
$ echo "iek"|sed -n '/ie*k/p'
iek
$ echo "ieek|sed -n '/ie*k/p'
ieek
将点号和星号组合起来使用,可以匹配任意多个任意字符。
$ echo "this is a regular pattern expression"|sed -n 'this is a regula.*expression'
this is a regular pattern expression
扩展正则表达式
- 问号
? 匹配前面的字符0次或1次。 - 加号
+ 匹配前面的字符1次或多次 - 花括号
{m} 匹配前面字符m次
{m,n} 匹配前面的字符m到n次
默认情况下gawk程序不会识别正则表达式区间。必须为gawk指定--re-interval
# 匹配电话号码
gawk --re-interval '/^\(?[2-9][0-9]{2}\)? \ # 区号
(| |-|\.) \
[0-9]{3}( |-|\.) \
[0-9]{4}/ {print $0}
- 管道字符
类似于逻辑或,有一个模式匹配就匹配
expr1|expr2
- 聚合表达式
用括号()将正则表达式聚合起来,此时该组字符会被当作标准字符。
$ echo "Sat"|gawk '/Sat(urday)?/{print $0}'
Sat