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} | 匹配之前的项n次 | [0-9]{3} 匹配任意一个三位数,[0-9]{3} 可以扩展为[0-9][0-9][0-9] |
{n,} | 之前的项至少需要匹配n次 | [0-9]{2,} 匹配任意一个两位或者更多的数字 |
{n,m} | 指定之前的项所必须匹配的最小次数和最大次数 | [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