Linux学习--No.13正则表达式
上一节提到根据文本模式进行sed编辑匹配行文本时,往往搭配正则匹配式进行高效检索、编辑。这一次来专门学习下正则表达式的相关知识。
一、基本概念
正则表达式为用户所定义的模式模板(pattern template),利用一系列通配符来描述数据流中的一个或多个字符。针对不同编程语言、应用程序等,正则表达式均有不同的类型,这正是其复杂且强大的原因。
正则表达式是通过正则表达引擎(regular expression engine)来进行解释正则表达模式的。在Linux里,有两种流行的正则表达引擎:POSIX基础正则表达式(basic regular expression,BRE)与POSIX扩展正则表达式(extended regular expression,ERE)。
二、BRE模式
大多Linux工具均符合该引擎规范,有些只符合该规范的子集(比如之前学的sed编辑器)
1、单纯文本匹配
很好理解,但有以下两个注意点
- 区分大小写;
- 空格也被当做字符。
echo "This is a test" | sed '/test/p'
echo "This is a test" | sed '/te/p'
echo "This is a test" | sed '/s a/p'
上述代码均能返回下述结果
This is a test
2、特殊字符匹配(通配符)
.*[]^${}\+?|()
这些通配符在正则表达式里有特殊的含义。如果想把它们当做普通的文本字符,需要在前面加转义符反斜线(\)。有趣的是,反斜线本身就是一个特殊字符(也许就特殊在转义吧)
2.1、脱字符^
与美元符 $
(1)脱字符^
定义了行首开始的文本模式
echo "This is a test" | sed '/^Th/p'
#定义了仅匹配以 Th 开头的行文本
注意在上述用法中,脱字符^的位置必须要模式的开头(第一个正斜线后面),否则会被认为是文本字符。
(2)美元符 $
定义了行尾结束的文本模式
echo "This is a test" | sed '/st$/p'
#定义了仅匹配以 st 结尾的行文本
(3)联合使用,删除空白行
sed '/^$/d' data1.txt
#删除data1.txt里的所有空白行
2.2、点号.
点号.
代表了任意单个字符(可以是空格)。
sed -n '/.at/p' data1.txt
#含有hat、cat、bat等的文本行均可被匹配,但是以at开头的文本就不行
2.3、方括号[ ]
方括号[ ]
依旧代表一个字符,不过必须属于方括号指代范围内的字符组之一。
sed -n '/[chb]at/p' data1.txt
#匹配含有cat、hat、bat的文本行
sed -n '/[01234]at/p' data1.txt
- 衍生用法1、方括号排除
[^ ]
依旧代表一个字符,但是要不属于方括号指代范围内的字符组。
sed -n '/[^chb]at/p' data1.txt
#非c、h、b三种字母与at组合的均可,比如dat、eat、fat....甚至" at"
- 衍生用法2、方括号区间范围
sed -n '/[0-9]56/p' data1.txt
sed -n '/^[0-9][0-9][0-9][0-9][0-9]$/p' data1.txt #用于查找仅由5个数字组成的行文本
#用于查找仅由5个数字组成的行文本
sed -n '/[a-m]at/p' data1.txt
sed -n '/[a-mq-y]at/p' data1.txt
#定义两个选择区间 a-m与q-y
2.4、星号*
星号*
放在某字符后面,表明该字符出现了0次或多次。常用!
sed -n '/at*s/p' data1.txt
# 比如可以匹配as、ats、atts等
不过,它更常见的用法是放在句尾,用来查找一些列拥有相同前缀/后缀的文件(类似于锚字符)
ls -lh li*
除了上述自定义模式外,BRE还包括一些特殊的字符组,可用来匹配特定类型的字符(p434),比如
[[:alpha:]]
代表匹配任意字母字符,不论大小写。
- 此外还有POSIX扩展正则表达式(extended regular expression,ERE)向Linux应用与工具提供了一些额外的符号,比如gawk编辑器能够识别ERE模式。这里简单介绍下这些符号:
(1)问号?
类似于*
星号 区别在于问号仅允许前面的字符出现0次或1次;
(2)加号+
也类似于*
星号 区别在于问号仅允许前面的字符出现1次或多次;
(3)花括号{ }
允许为可重复的正则表达式指定一个上限;
(4)管道符号|
允许用逻辑OR的方式指定正则表达式引擎要用的两个或多个模式。
以上是关于Linux正则表达式的简单学习。寒假Linux的学习暂时就告一段落吧,要开始学校网课的学习了~ 加油!
参考教材《Linux命令行与shell脚本编程大全》