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}'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值