正则表达式

正则表达式(Regular Expression) 正则表达式是一种字符特征的描述方式,用来在文本中匹配到用户想要的东西.

正则表达式与通配符:

1.正则表达式一般用于处理文本内容,常用命令有grep,sed,awk,vim等

通配符一般用于匹配文件名,常用命令有find,ls,cp等

2.各符号的含义不尽相同.

什么地方使用正则表达式

vim grep sed awk nginx apache mail垃圾邮件过滤。。。 perl java python 等等都使用正则

构成

1.元字符(基本元字符、扩展元字符)

2.除元字符之外的任意字符都是表示他字面意思的正则表达式

正则表达式的匹配过程

正则表达式是按照从表达式最左端第一个字符开始,左到右依次一个一个字符进行匹配.当字符串中有字符成功匹配到正则表达式中字符,则从这个位置开始尝试正则表达式中的下一个字符进行匹配,如果匹配成功则继续从这个位置开始匹配正则表达式中下一个字符;如果匹配不成功,则“回溯”到第一次匹配的字符处重新从正则表达式中第一个字符开始匹配。

特征

贪婪匹配

基本元字符

1.字符匹配

** . 任意单个字符**

sed 's/./A/' /tmp/pass将/tmp/pass文件中每行的第一个字符替换为A

sed 's/./A/g' /tmp/pass将/tmp/pass文件全局替换为A

sed 's/../A/' /tmp/pass将/tmp/pass文件前俩个字符替换为A

** [] []内的任意单个字符**

sed 's/[abc]/A/' /tmp/pass将/tmp/pass文件每行第一个含有abc的替换为A

** [ a-z] 任意单个小写字母**

sed 's/[a-z]/A/g' /tmp/pass将/tmp/pass文件除数字外的小写字母替换为A

** [a-zA-z] [0-9] [a-zA-z0-9]**

sed 's/[a-zA-Z0-9:]/A/g' /tmp/pass将/tmp/pass文件字符全局替换

    [^]            首位为^表示取反

[^0-9]除了数字外的任意当个字符

[a-z]小写字母

[0-9]数字

[A-Z]大写字母

[a-zA-Z]所有字母

[^a-zA-Z0-9]所有符号

sed 's/[^a-zA-Z0-9]/A/g' /tmp/pass所有符号替换为A

次数匹配

** * 匹配前面的字符重复****0次****到多次*

{****n****}****匹配前面的字符重复任意次数

{n,m}前面的字符重复n次到m次

{,n} 前面的字符最多重复n次

{n,} 前面的字符最少重复n次

** 位置匹配**

^ 行首

$ 行尾

< 词首

> 词尾

sed 's/<[a-z]{3}>/A/' /tmp/pass只有三个字符的替换为A

扩展元字符****Extended Metacharacters (egrep and awk)

sed -r

  •        +前面的字符至少重复一次
    

?? 前面的字符重复0次或1次

{} 次数匹配意义同基本元素中的{}

|或着

() 分组

\数字 引用分组的内容

前向: 在正则中引用

后向: 在其他地方引用, \0表示引用模式中所有的内容 \0 ⇔ &

echo hello | sed -r 's/(..)/\1\1/'

hehello

echo hello | sed -r 's/(..)(..)/\2\2/'

llllo

echo hello | sed -r 's/(..)(..)/\2\1/'

llheo

echo hello | sed -r 's/(..)(..)/\0\0/'

hellhello

echo hello | sed -r 's/.*/\0\0/'

hellohello

sed -r 's/[0-9]+/(\0)/g' /tmp/pass

sed -r 's/ro|da/o/g' /tmp/pass

sed -r 's/(go){2,4}/O/g' a.txt

编写正则表达式的3 个步骤****:

1 知道要匹配的内容以及它如何出现在文本中。

2 编写一个模式来描述要匹配的内容

3 测试模式来查看它匹配的内容,不能错,不能漏,不能多

练习: head /etc/passwd > /tmp/pass

1. 删除每行的第一个字符

sed 's/.//' /tmp/pass

sed -r 's/(.)(.*)/\2/' /tmp/pass

2. 在每行行首插入hello

sed 's/^/hello/' /tmp/pass

sed -r 's/(.)/hello\1/' /tmp/pass

sed -r 's/(.)/hello\0/' /tmp/pass

sed -r 's/.*/hello&/' /tmp/pass

3. 删除每行的第二个字符

    # sed -r 's/(.)(.)(.*)/\1\3/g' /tmp/pass

4. 把每个数字用()括起来 如:(1)(2)

    # sed -r 's/[0-9]/(\0)/g' /tmp/pass

5. 把每个数值用()括起来 如:(12)

    # sed -r 's/[0-9]+/(\0)/g' /tmp/pass

6. 删除每行的倒数第二个字符

sed -r 's/(.)(.)行尾

7. 交换每行的第一个和最后一个字符

sed -r 's/(.)(.*)(.)/\3\2\1/g' /tmp/pass

sed -r 's/(.)(.*)(.)$/\3\2\1/g' /tmp/pass

8. 删除刚好三个字符的单词

sed -r 's/<[a-zA-Z]{3}>//g' /tmp/pass

sed -r 's/\b[a-zA-Z]{3}\b//g' /tmp/pass

9. 把ro或da替换成A

    # sed -r 's/ro|da/A/g' /tmp/pass

思考:

1. 删除每行的第一个单词(纯字母)

    # sed -r 's/[a-zA-Z]+//'  /tmp/pass

2. 交换第一个和倒数第二个单词(纯字母)

sed -r 's/([a-zA-Z]+)(.*)([a-zA-Z]+)([a-zA-Z]+)([a-zA-Z]+)/\3\2\1\4\5/' /tmp/pass

sed -r 's/([a-zA-Z]+)(.*)([a-zA-Z]+)([a-zA-Z]+)([a-zA-Z]+)([a-zA-Z]+)/\4\3\2\1\4\5/' /tmp/pass


POSIX字符类

点击这里点击这里

[:digit:]任何数字

[:xdigit:]任何十六进制数字

[:alpha:]任何字母

[:lower:]任何小写字母

[:upper:]任何大写字母

[:alnum:]任何字母或数字

[:cntrl:]ASCII控制字符(ASCII 0~31 和 ASCII 127)

[:punct:]不属于[:alnum:]和[:cntrl:]的任何字符

[:blank:]空格或制表符([\t ])

[:space:]任何空白字符,包括空格([\f\n\r\t\v ])

[:print:]任何可打印字符

[:graph:]同[:print:],但不包括空格

image

你可能感兴趣的:(正则表达式)