Linux命令行与shell脚本编程大全笔记(正则表达式)

*正则表达式就是所定义的模式模板
*正则表达式不关心数据在数据流中的位置
*都区分大小写
*可以在正则表达式中使用空格和数字
*若使用特殊字符则必须转义(\)反斜线
*特殊字符为: ^ $ . [] * \ 和 ? + {} | ()

基础正则表达式-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' 不匹配cathat, 排除型字符组需要在字符组开头加上脱字符^

区间-单破折号
*(-)单破折号表示区间
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}'

你可能感兴趣的:(shell)