欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-10 09:22:14
...

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

基础正则表达式-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
echo "bet" | gawk '/be{1}t/{print $0}' 匹配准确出现一次
echo "beeet" | gawk '/b[ea]{1,3}t/{print $0}' 匹配出现多次,并搭配字符组
echo "beeet" | gawk '/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)会匹配第一组,第二组中字母的任意组合