*
正则表达式就是所定义的模式模板
*
正则表达式不关心数据在数据流中的位置
*
都区分大小写
*
可以在正则表达式中使用空格和数字
*
若使用特殊字符则必须转义(\)反斜线
*
特殊字符为: ^ $ . [] * \ 和 ? + {} | ()
基础正则表达式-BRE
字符 | 释义 |
---|---|
^ | 脱字符(行首) |
$ | 美元符(行尾) |
. | 点字符 必须匹配一个字符 |
[] | 字符组 限定待匹配字符 |
* | 星号 零个或多个 |
\ | 反斜杠(转义) |
锚字符(^,$)
*
脱字符(^
)定义数据流中文本行的行首开始的模式
*
将脱字符放到模式开头的其他位置,则为普通字符,不识别为特殊字符
echo "This is a pan" | sed -n '/^This/p' 行首匹配
*
美元符($
)定义了行尾锚点
echo "this is a pan" | sed -n '/pan$/p' 行尾匹配
echo "this is a test" | sed -n '/^this is a test$/p'
组合使用
sed '/^$/d' test1.txt
过滤并删除空白行
点号字符
*
点字符用来匹配除换行符之外的任意字符
*
必须匹配一个字符,若无任何字符,则模式不成立
echo "this is a test" | sed -n '/.is/p'
空格也是字符,可以匹配
字符组
*
字符组([]
)限定待匹配的具体字符
echo "Yes" | sed -n '/[Yy]es/p'
匹配yes或Yes
echo "Yes" | sed -n '/[Yy][Ee][Ss]/p'
单个表达式中的多个字符组
echo "111" | sed -n '/[1234]/p'
单个表达式中的匹配多字符
排除型字符组
sed -n '/[^ch]at/p'
不匹配cat
和hat
, 排除型字符组需要在字符组开头加上脱字符^
区间-单破折号
*(-)
单破折号表示区间
sed -n '/^[0-9][0-9][a-z][c-d][e-g]/p' a.txt
区间匹配 :22bdf
sed -n '/^[a-z][c-df-h]/p' a.txt
单个字符组指定多个不连续区间
星号
*
在字符后面放置星号表示该字符在匹配模式中出现0次或者多次
echo "this" | sed -n '/thisd*/p'
表示d出现0次匹配上
echo "this" | sed -n '/thd*[iI]*s/p'
可以用在字符组上
扩展正则表达式-ERE
字符 | 释义 |
---|---|
? | 问号,出现0次或一次 |
+ | 加号,前面的字符必须出现一次或者多次 |
{} | 花括号,间隔,为重复的表达式指定上下限 |
| | 管道符号,用逻辑或指定表达式的两个或者多个模式 |
() | 圆括号,分组 |
问号
*
类似于星号,问号前面的字符只能出现0次或者一次
*
可以和字符组一起使用
echo "bt" | gawk '/be?t/{print $0}'
匹配0次
echo "bet" | gawk '/b[ea]?t/{print $0}'
匹配一次,并搭配字符组
echo "beeet" | gawk '/be?t/{print $0}'
不匹配
加号
*加号前面的字符必须出现一次或者多次,否则不匹配
echo "bet" | gawk '/be+t/{print $0}'
匹配一次
echo "beaet" | gawk '/b[ea]+t/{print $0}'
匹配多次,并且搭配字符组
echo "bt" | gawk '/be+t/{print $0}'
不匹配
花括号
*
允许为可重复的正则表达式指定一个上限。通常称为间隔
* m
正则表达式准确出现m
次
* m,n
正则表达式至少出现m
次,至多n
次
*
默认情况下,gawk不会识别间隔,必须加上 --re-interval
echo "bet" | gawk --re-interval '/be{1}t/{print $0}'
匹配准确出现一次
echo "beeet" | gawk --re-interval '/b[ea]{1,3}t/{print $0}'
匹配出现多次,并搭配字符组
echo "beeet" | gawk --re-interval '/be{1,2}t/{print $0}'
不匹配
管道符
*
管道符允许检查数据流时,用or
的方式指定正则表达式两个或者多个模式
echo "He has a hat." | gawk '/[ch]at|dog/{print $0}'
管道符两侧可以采用任何表达式模式
圆括号
*
将正则表达式模式分组时,该组会被视为一个标准字符
echo "Sat" | gawk '/Sat(urday)?/{print $0}'
匹配0次
echo "Saturday" | gawk '/Sat(urday)?/{print $0}'
匹配1次
echo "cat" | gawk '/(c|b)a(b|t)/{print $0}' 模式(c|b)a(b|t)
会匹配第一组,第二组中字母的任意组合
几个栗子
# 解析电话号码格式
# (234)456-7890
# (134) 111.1234
#123-123.12334
gawk --re-interval '/^\(?[2-9][0-9]{2}\)?(| |-|\.|)[0-9]{3}( |-|\.)[0-9]{4}$/{print $0}'
#解析邮件地址
gawk --re-interval '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.\+]+).([a-zA-Z]{2,5})$/{print $0}'