关于正则表达式第一篇(r3笔记第29天)

作者: admin 分类: 公众号存档            2 次浏览 发布时间: 2014-10-18 23:16

公众号:杨建荣的学习笔记 · 作者:r3笔记第29天 · 发布:2014-10-18 23:16:51 · 原文链接

正则表达式在编程语言中,数据库中,linux中都有着广泛的应用,一说起正则表达式就有些高深晦涩的味道,正则表达式精炼而重要,在Linux中有着举足轻重的作用,也是学好sed,awk的一个基本门槛。
正则表达式是基于正则表达式引擎来实现的,引擎主要有以下两类。可能大家对这个比较陌生。
POSIX基本正则表达式引擎 BRE
POSIX扩展正则表达式引擎 ERE
大多数的Linux实现中都是BRE,也是默认的实现,还有扩展的实现就是ERE.
像grep,awk就支持基本和扩展的引擎,sed只支持基本引擎,也是基于性能的考虑。
学习awk相当于学习了一门新的编程语言,所以awk的功能很完善,扩展的引擎也支持了。
grep可以实现扩展的引擎,但是需要使用-E选项。

比如我们想查看一个字符bt,在b和t中间的字符可以出现0次或者1次。
bt,bat,bet等都是匹配的字符。

$ echo “bt” |grep ‘b[ae]?t‘ –如果没有使用ERE就不会匹配到任何的数据

$ echo “bt” |grep -E ‘b[ae]?t’ –启用了ERE之后,就可以正确匹配了。
bt

关于BRE,主要有以下的模式
纯文本
特殊字符
锚字符
点字符
字符组
排除字符组
使用区间
特殊字符组
星号

–纯文本

对于纯文本来说是大小写敏感的,空格和数字也可以正常匹配,胆识空格不需要转义
比如我们需要匹配 一个字符串出现this的情况,使用This和this就有很大的不同。
—使用sed来匹配
$ echo “This is a test”|sed -n ‘/This/p’
This is a test
echo “This is a test”|sed -n ‘/this/p’
$
–使用awk来匹配
$ echo “This is a test”|awk ‘/This/{print $0}’
This is a test

–使用grep来匹配
$ echo “This is a test”|grep ‘This’
This is a test
$ echo “This is a test”|grep -i ‘THis‘ –忽略大小写
This is a test

–特殊字符
以下的字符在正则表达式中会被视为特殊字符。
.*[]^$\+?|()
所以不能在文本中单独使用如上的特殊字符,需要加\做一个转义。
–sed来匹配字符\
echo “\ is a special character”|sed -n ‘/\\/p’
\ is a special character

–sed来匹配字符$,以下是几种测试的场景,可以对比一下输出结果。

$ echo “The price is $5.00″|sed -n ‘/$/p’
The price is .00
$ echo “The price is $5.00″|sed -n ‘/\s/p’
The price is .00

$ echo “The price is $5.00”
The price is .00
$ echo “The price is \$5.00”
The price is $5.00
$ echo ‘The price is $5.00’
The price is $5.00
$ echo ‘The price is $5.00’|sed -n ‘/\$/p’
The price is $5.00
echo “The price is $5.00″|sed -n ‘/\$/p’

对于字符/
$ echo “3 / 2″|sed -n ‘///p’
sed: -e expression #1, char 3: unknown command: `/‘
出这个错误是因为左斜线不是正则表达式的特殊字符的一部分,但是也需要转义,下面这样就没有问题了。
$ echo “3 / 2″|sed -n ‘/\//p’
3 / 2

后续部分在第二篇中继续分享。

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注