Linux入门linux学习

Linux学习--No.13正则表达式

2020-02-26  本文已影响0人  小贝学生信

上一节提到根据文本模式进行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
sed -n '/[^chb]at/p' data1.txt 
#非c、h、b三种字母与at组合的均可,比如dat、eat、fat....甚至" at"
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:]] 代表匹配任意字母字符,不论大小写。


以上是关于Linux正则表达式的简单学习。寒假Linux的学习暂时就告一段落吧,要开始学校网课的学习了~ 加油!
参考教材《Linux命令行与shell脚本编程大全》

上一篇下一篇

猜你喜欢

热点阅读