一、正则表达式

1.1 简介

shell脚本语言包含了众多用于解决Unix/Linux系统问题必不可少的组件,文本处理是shell脚本擅长的重要领域之一。它可以与sed、awk、grep、cut这类优美的工具组合在一起来解决文本处理问题。

1.2 使用正则表达式

正则表达式是基于模式匹配的文本处理技术的关键所在,想要在编写文本处理工具方面驾轻就熟,你就要对正则表达式有一个基本的概念,通配符能够匹配的文本范围相当有限,正则表达式是一种用于文本匹配的形式小巧、具有高度针对性的编程语言;

1.2.1 实战演练

正则表达式是由字面文本和具有特殊意义的符号组成的,我们可以根据具体需求,使用它们构造出合适的正则表达式来匹配文本。因为正则表达式是一种匹配文本的通用语言;

# 要匹配给定文本中的所有单词,可以使用下面的正则表达式:
(?[a-zA-Z]+ ?) 
"?" 用于匹配单子前后可能出现的空格,[a-zA-Z]+ 代表一个或多个字母(a~z和A~Z)

# 要匹配一个ip地址,可以使用下面的正则表达式:
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
或者
[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}

# 详解:我们知道ip地址通常的书写形式是192.168.0.2,它是由点号分割的4个整数(每一个整数的取值范围从0-255)。[0-9]或[:digit:]匹配数字0-9。{1,3}匹配1到3个数字,\.匹配“.”

注意:这个正则表达式可以匹配所处理文本中的ip地址,但它并不检测地址的合法性。例如:形如123.300.1.1的ip地址可以被正则表达式匹配,但这却是一个非法的ip地址。不过在解析文本流时,通常目标仅仅是找出ip地址而已。

1.2.2 工作原理

先看一下正则表达式的基本组成部分

正则表达式 描述 示例
^ 行起始标记 ^tux匹配以tux起始的行
$ 行结尾标记 tux$匹配以tux结尾的行
. 匹配任意一个字符 abc.匹配abc1和abc2,但是不能匹配abc11和abc22
[] 匹配包含在[字符]之中的任意一个字符 coo[kl] 匹配cook或者cool
[^] 匹配除[^字符] 之外的任意一个字符 9[^01] 匹配到92或93,但是不能匹配到90或91
[-] 匹配[] 中指定范围内的任意一个字符 [1-5] 匹配从1~5的任意一个字符
? 匹配之前的项1次或0次 colou?r 匹配color或colour,但不能匹配colouur
+ 匹配之前的项1次或多次 nihao-1+ 匹配nihao-11、nihao-1,但是不能匹配nihao-
* 匹配之前的项0从或多次 co*l 匹配cl、col、coool等
() 创建之前的项n次 ma(tri)?x 匹配max或maxtrix
匹配之前的项n次 [0-9]{3} 匹配任意一个三位数,[0-9]{3} 可以扩展为[0-9][0-9][0-9]
之前的项至少需要匹配n次 [0-9]{2,} 匹配任意一个两位或者更多的数字
指定之前的项所必须匹配的最小次数和最大次数 [0-9]{2,5} 匹配从两位数到五位数之间的任意一个数字
| 交替——匹配 | 两边的任意一项 Oct (1st | 2nd) 匹配Oct 1st 或 Oct 2nd
\ 转义符可以将上面介绍的特殊字符进行转义 a\.b匹配a.b,但不能匹配ajb。通过在.之间加上前缀 \.从而忽略了.的特殊意义

1.2.3 补充内容

1. 处理特殊字符
正则表达式用$、^、.、*、+、{以及} 等作为特殊字符。但是如果我们希望将这些字符作为非特殊字符(表示普通字母含义的字符),应该怎么做?
例子:a.txt
它会匹配字符a,然后是任意字符,接着是字符串txt。但是我们系统“.”能够匹配字面意义上的'.',而非任意字符。所以我们在这个字符之前加上一个反斜杠\(这叫做“将该字符进行转义”)。这表明正则表达式希望匹配的是字面字符,而不是它所代表的特殊含义。因此,最终的正则表达式就变成了a.txt

2. 可视化正则表达式
正则表达式有时候很难理解,但是人们更易于理解带有图示的事物,因此就出现了一些将正则表达式进行可视化的工具。https://regexper.com

posted @ 2021-08-20 22:06  锦书致南辞  阅读(156)  评论(0编辑  收藏  举报