正则表达式
正则表达式是通过正则表达式引擎实现的,linux有2种流行的正则表达式引擎:
1.POSIX基本正则表达式(BRE)引擎
2.POSIX扩展正则表达式(ERE)引擎
大多数linux工具都至少符合POSIX BRE引擎规范,有些工具,如sed只实施了BRE的子集,gawk使用ERE引擎来。
BRE模式
1.纯文本
支持文本,且 区分大小写、支持空格。
2.特殊字符
可识别^、$等特殊字符,如果要单独使用,需要在前面加\进行转义。
#echo 'The cost is $4.00' | sed -n '/\$/p'
The cost is $4.00
备注:/不是特殊字符,但在sed或gawk中使用时需要转义
#echo "3 / 2" | sed -n '/\//p'
3 / 2
3.锚字符
^ :锚定行首,此字符后面的字符必须出现在行首
$:锚定行尾,此字符前面的字符必须出现在行尾
\b或\<:锚定词首,此字符后面的字符必须作为单词开始
\b或\>:锚定词尾,此字符前面的字符必须作为单词结束
#匹配以Book开始的行 # echo "Books are great" | sed -n '/^Book/p' Books are great 组合锚定: 1.匹配特定的行 #sed '^this is a test$' 2.删除文件空白行 #sed '/$^/d' testfile
#匹配以w开头的单词
#echo 'hello world, hello beijing.' | sed -n '/\<w/'
hello world, hello beijing.
3.点字符:.号
匹配任意单个字符(包括空格),除换行符
#echo 'this is a cat' | sed -n ‘/.at/p’
this is a cat
4.星号:*
匹配前1字符任意次,包括0次
#echo 'ik' | sed -n '/ie*k/p' ik #echo 'iek' | sed -n '/ie*k/p' iek #echo 'iek' | sed -n '/ie*k/p' ieek 1.用于不同语言拼写差异,如:美式英语、英式英语的colour和color表示同一意思 #echo 'I'm getting a color TV' | sed -n '/colou*r/p' I'm geting a color TV #echo 'I'm getting a colour TV' | sed -n '/colou*r/p' I'm geting a colour TV 2.点号与星号连用,0到多个任意字符 #echo 'You are a boy.' | sed -n '/You.*boy/p' You are a boy. #echo 'Youboy' | sed -n '/You.*boy/'p Youboy 3.星号和字符组组合,指定文本中出现多个的一组字符或一个字符区间 #echo 'bt' | sed -n '/b[ae]*t/p' bt #echo "bat" | sed -n '/b[ae]t/p' bat #echo "baakkt" | sed -n '/b[ae]t/p' #出现的kk非字符组中的字符,所以不匹配。
5.字符组:[]
[]:匹配[]中的任意字符
[acd157] 匹配a、c、d、1、5、7的任意一个
[a-ch-m] 匹配a到c、h到m之间的任意一个(指定多个区间)
[0-3] 匹配0-3(指定单个区间)
[^]:匹配[]中的任意字符外的其他字符
[^a-b] #匹配除a-b之外其特所有单个字符
特殊字符:
[:alpha:] 匹配任意字母,即A-Z和a-z
[:lower:] 匹配任意小写字母
[:upper:] 匹配任意大写字母
[:alnum:] 匹配任意字母和数字,即0-9、A-Z、a-z
[:digit:] 匹配0-9数字
[:space:] 匹配任意空白字符:空格、制表符、NL、FF、VT和CR
[:blank:] 匹配空格或制表符
[:print:] 匹配任意可打印字符
[:punct:] 匹配标点符号
这些特殊字符在字符组中,表现为:[[:digit:]]
典型案例: 1.不清楚字符大小写时用 #echo "yes" | sed -n '[Yy]es' yes #echo "Yes" | sed -n '[Yy]es' Yes 2.多个字符组连用(多个字符都不知道大小写) #echo "yEs" | sed -n '[Yy][Ee][Ss]' yEs 3.匹配任意数字 #echo "abc123" | sed -n '/[[:digit:]]/p' abc123
5.聚合表达式:()
()中的内容必须匹配
#echo "start" | sed -n '/st\(art\)/p'
start
备注:BRE使用聚合分组时,需要对园括号进行转义
聚合组引用:
\1:引用第1个聚合组
\2:引用第2个聚合组
#echo "start abc start" | sed '/st\(art\) abc st\1/p'
start abc start
备注:
BRE也支持ERE的?、+、|、{}用法,只是需要使用反斜杠进行转义
ERE模式
ERE支持BRE的所有内容,新增如下内容:
1.问号
匹配前1字符0次或1次
#echo 'bet' | gawk '/be?t/{print $0}' #echo bt也可匹配,echo beet则不会被匹配 bet 问号与字符组一起使用 #echo 'bat' | gawk '/b[ae]?t/{print $0}' #表示问号前的字符组中任意字符出现0-1次 bat
2.加号
匹配前一字符1次或多次,至少1次。
#echo ‘bet’ | gawk '/be+t/{print $0}' #bt不匹配,beet匹配
bet
3.花括号:{}
指定前1字符出现的次数
{m,} #前1字符至少出现m次
{m} #前1字符只出现m次
{m,n} #前1字符至少出现m次,最多出现n次
示例: 1.grep #echo ''beeet" | grep -E 'be{3}t' 2.gawk #echo "beeet" | gawk --re-interval '/be{1,3}t/{print $0}' #gawk要支持{},需要--re-interval
4.管道符:|
多个模式之间使用|,任何一个模式匹配则匹配成功
#echo "The cat is asleep" | gawk '/dog|cat/{print $0}' The cat is asleep #echo "The dog is asleep" | gawk '/dog|cat/{print $0}' The dog is asleep
5.聚合表达式
参见BRE,只是不需要对圆括号进行转义。