马哥学习李洋个人笔记之-----正则表达式

正则表达式

什么是正则表达式?
正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法,通过定义的这些特殊符号
的辅助,就可以快速过滤,替换或输出需要的字符串。Linux正则表达式一般以行为单位处理。

即: 1 正则表达式是一种描述一组字符串的模式。
2 为处理大量文本|字符串而定义的一套规则和方法。
3 以 行 为单位出来,一次处理一行。

正则表达式和通配符的区别

1 正则表达式用来找:【文件】内容,文本,字符串
2 通配符用来找:文件名,普通命令都支持

存在一些在通配符和正则当中意思一致却不一样的情况
比如 通配符里面,匹配任意一个字符是 "?" 正则当中,匹配任意一个字符是"."

或同一个字符在通配和正则当中是两个意思的情况。
比如 "^"符号在通配符中是 除了...之外的意思, 而在正则里面则是 以...开头的意思.

也存在着,不管是在通配符或者正则当中,有一致的情况.
比如 [:alnum:] 都表示字母和数字的意思.

按用途分类,有如下几种:

1 用来表示内容,不管重复次数的字符.

2 括号的作用,
小括号表示当中的载体是一个整体,是与的意思。
中括号表示当中的载体是一个个体,是或的意思。
尖括号表示确定位置,是以某处开始的意思.
大括号用来表示重复的次数,单独数字表示具体的个数,{数字,}表示至少几次, {,数字}表示至多几次.

在grep中使用正则表达式,需要用单引号或双引号圈起来.

字符匹配:只匹配单个字符,不管指定范围里面内有多少字符,满足条件的都列出来。

. 匹配任意单个字符

[] 匹配指定范围内的任意单个字符

[^] 匹配指定范围外的任意单个字符 [^a]表示除了a之外的所有字符都符合.

[:alnum:] 字母和数字

[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z

[:lower:] 小写字母 或 [a-z]

[:upper:] 大写字母 或 [A-Z]

[:blank:] 空白字符(空格和制表符)

[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)

[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)

[:digit:] 十进制数字 或 [0-9]

[:xdigit:] 十六进制数字

[:graph:] 可打印的非空白字符

[:print:] 可打印字符 在ascii字符中,从21到126之间的字符叫可打印字符.

[:punct:] 标点符号

这些字符匹配当中, "."的范围最大,任何一个字符都能匹配到.中括号里面的内容为 或 的方式.
不管有多少,只匹配其中的一个.

匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

  • 匹配前面的字符任意次,包括0次 贪婪模式:尽可能长的匹配

.* 任意长度的任意字符 任意长度的字符串

\? 匹配其前面的字符0或1次 包括匹配0次

+ 匹配其前面的字符至少1次 可出现多次但至少为1次.

{n} 匹配前面的字符n次 n可替换为数字,确定匹配的次数.

{m,n} 匹配前面的字符至少m次,至多n次

{,n} 匹配前面的字符至多n次 小于等于n

{n,} 匹配前面的字符至少n次 大于等于n

位置锚定:定位出现的位置

^ 行首锚定,用于模式的最左侧

$ 行尾锚定,用于模式的最右侧

^PATTERN$ 用于模式匹配整行

 ^$ 空行   注意'^  '只会匹配一个空格.

  ^[[:space:]]*$ 空白行  无论这个空白行是回车还是空格或者TAB键都能匹配.

grep -v "^[[:space:]]*$" +文件 可以去掉任何文件的任务空白行

\<或 \b 词首锚定,用于单词模式的左侧

cat 123 |grep "\<r" 匹配r开头的

\>或 \b 词尾锚定;用于单词模式的右侧

cat 123 |grep "t\>" 匹配t结尾的

\<PATTERN\> 匹配整个单词 \< abc \> 严格匹配单词abc. 等同于 grep -w 选项
PS: 使用egrep引用正则时候,一律用双引号引起来才算正则。

echo add a b c d |egrep "\<add\>" ,

"\<add\>"可以写为(add)+,前者表示一个完整的单词,后者表示引用括号内的字符串
+号表示至少引用1次.

add a b c d

正则引用:

分组:() 将一个或多个字符捆绑在一起,当作一个整体进行处理

举例:在 (root)+当中,(root)是一个整体,后面的+是正则当中至少重复一次的意思.

分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为
: \1, \2, \3, ...

\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

示例: (string1+(string2)) 正则格式 ( 与 ) 是固定格式.去掉后第一个选项变为
string1+string2
第二个是 string2,加上格式后,最左侧的括号要对应最右边的括号.里面的小
括号也是依次对应自己的位置。

\1 :string1+(string2)*
\2 :string2

后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身或者:|

示例:a|b: a或b C|cat: C或cat (C|c)at:Cat或cat

正则当中的转义符\及双引号""很重要.缺少了\,不会被命令当做正则来处理,
缺少了""则不会被当做一个整体参数.

一些正则实例: 123.txt内容为/etc/passwd的内容

匹配以li开头的内容

grep "^li" 123.txt

匹配以yang结尾的内容

grep "yang$" 123.txt

匹配空行,不包过空格

gerp -n "^$" 123.txt

匹配空格,不包括空行

grep -n " " 123.txt

匹配以包括.g的词.

grep ".g" 123.txt

点号在正则当中原本是替代任意一个字符的意思,加上转义符\会表示原本的意思.

匹配前一个字符0个或多个(即重复的意思)

grep -n "q*" 123.txt

*匹配包括0次,所以计算机会先把所有0次的列出来,即完整的显示出这个文件的所有内容.
然后再把大于0次的单独列出来.

匹配任意字符开头的.

grep -n "^.*" 123.txt

匹配任意字符结尾的

grep -n ".*$" 123.txt

匹配以中括号里任意一个字符开头的行

grep -n "^[li]" 123.txt

这里的li是和的意思,及l和i开头的都会单独显示出来.

匹配中括号内,包括任意一个字符或数字的行.

grep -n "[a-z]|[0-9]" 123.txt

会把包含a-z,0-9的所有选项都列出来。

匹配除了abc外的选项

grep -n "[^abc]" 123

正则当中的^是行首的意思,放在中括号里是除了...之外的意思.[^abc]可理解为对abc的取反.

匹配之前重复的字符a,2到5次

grep -n "a{2,5}" 123

匹配之前重复的字符 a 至少2次,

grep -n "a{2,}" 123

至少意味着大于或等于,即重复两次的a及两次以上的a都会显示出来.

匹配之前重复的字符 a 至多3次,

grep -n "a{,3}" 123

至多意味着小于或等于,即重复三次的a及三次以下的a都会显示出来.

扩展正则例子

匹配行首重复的字符一个或多个(多个的话需要用小括号圈起来)的行

grep "^[abc]+" 123

+是指重复次数至少1次及以上,[]表示里面的内容,字符之间是或的关系.

匹配行重复字符ab最多一次的行.

grep "^(ab)\?" 123

\?是指重复次数最多1次,最少可为0次,()表示里面的内容是一个整体,与的关系.

同时过滤ab与bc

grep "ab|bc" 123

假设文件内是ababc,那么此命令只会显示出来abab,不会单独再显示出bc.因为匹配是按从左到右的
顺序优先匹配符合项,已经匹配的不会再次参与.所以把内容改为 abbc,才会显示ab或bc.即abbc.

匹配开头字符和结尾字符完全一致的行

cat 123 |grep "^(\<c.o\>).\1$"

caocao..............caocao

这里是只有一个变量,所有\1代表了(\<c.*o\>)这个整体,如果有多个变量的话,则存在\2,\3.

匹配开头字符和结尾字符完全一致,且中间数字一致的的行

cat 123 |grep "^(\<r.\>).([0-9]+):\2.*\1$"

(\<r.*\>)代表的是变量1,记为\1,
([0-9]+)代表的是变量2.记为\2,
冒号:是passwd文件中的分隔符
+是匹配前面字符至少1次的意思,在这题里可改变为 {1},即([0-9]{1})=([0-9]+)

基础正则BRE 扩展正则ERE
\? ?
+ +
{} {}
( \ ) ()
\
明显看出,两者的区别是省略了转义符.

转载于:https://blog.51cto.com/13477118/2124749

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值