Linux shell之正则表达式(《Linux与Unix shell编程指南》读书笔记)

本文介绍了正则表达式的基本概念及使用方法,包括如何利用特殊字符进行文本匹配,以及如何结合多种模式完成复杂的检索任务。

1.说明

       本文参考摘录自《Linux与Unix shell编程指南》 


2.基本概念

     当从一个文件命令输出中抽取或过滤文本时,可以使用正则表达式(RE),正则表达式是一些特殊或不很特殊的字符串模式的集合。

      为了抽取或获得信息,我们给出抽取操作应遵守的一些规则。这些规则由一些特殊字符或进行模式匹配操作时使用的元字符组成。也可以使用规则字符作为模式中的一部分进行搜寻。例如,A将查询A,x将查找字母x。

      系统自带的所有大的文本过滤工具在某种模式下都支持正则表达式的使用,并且还包括一些扩展的元字符集。这里只涉及其中之一,即以字符出现情况进行匹配的表达式,原因是一些系统将这类模式划分为一组形成基本元字符的集合。

基本元字符集及其含义

只匹配行首
$
只匹配行尾

只一个单字符后紧跟*,匹配0个或多个此单字符
[ ] 
只匹配[]内字符。可以是一个单字符,也可以是字符序列。可以使用表示[]内字符序列范围,如用[1-5]代替[12345]

只用来屏蔽一个元字符的特殊含义。因为有时在shell中一些元字符有特殊含义。\可以使其失去应有意义

.
只匹配任意单字符
pattern\{n\} 
只用来匹配前面pattern出现次数。n为次数
pattern\{n,\}
只含义同上,但次数最少为n
pattern\{n,m\} 只含义同上,但pattern出现次数在n与m之间

3.使用说明

3.1使用句点匹配单字符

句点“.”可以匹配任意单字符。“.”可以匹配字符串头,也可以是中间任意字符。例:

...x..x..x

3.2在行首以^匹配字符串或字符序列

^只允许在一行的开始匹配字符或单词。例:

^d


^001


可以将各种模式结合使用

^ ...4XC....


//以上模式表示,在每行开始,匹配任意 3个字符,后跟4 X C,最后为任意4个字符。^在正则表达式中使用频繁,因为大量的抽取操作通常在行首。

3.3在行尾以$匹配字符串或字符

可以说$与^正相反,它在行尾匹配字符串或字符,$符号放在匹配单词后。假定要匹配以单词trouble结尾的所有行,操作为:trouble$ 

3.4使用*匹配字符串中的单字符或其重复序列

使用此特殊字符匹配任意字符或字符串的重复多次表达式。例:

10133 *


3.5使用\屏蔽一个特殊字符的含义

假定要匹配包含字符“.”的各行而"."代表匹配任意单字符的特殊字符,因此需要屏蔽其含义。操作如下:

\.

//上述模式不认为反斜杠后面的字符是特殊字符,而是一个普通字符,即句点.

如果要在正则表达式中匹配以.cpp结尾的所有文件,可做如下操作:

*\.cpp

//通过ls -li 验证*\.cpp和*.cpp输出结果一致

3.6使用[]匹配一个范围或集合

       使用[]匹配特定字符串或字符串集,可以用逗号将括弧内要匹配的不同字符串分开,但并不强制要求这样做(一些系统提倡在复杂的表达式中使用逗号),这样做可以增加模式的可读性。使用“-”表示一个字符串范围,表明字符串范围从“-”左边字符开始,到“-”右边字符结束。如果熟知一个字符串匹配操作,应经常使用[]模式。

3.6.1假定要匹配任意一个数字,可以使用:

[0123456789]

然而,通过使用“-”符号可以简化操作:

[0-9]

3.6.2匹配任意小写字母

[a-z]

要匹配任意字母,则使用:

[A-Za-z]

表明从A-Z、a-z的字母范围。

如要匹配任意字母或数字,模式如下:

[A-Za-z0-9]

3.6.3在字符序列结合使用中,可以用[]指出字符范围。假定要匹配一单词,以s开头,中间有一任意字母,以t结尾,那么操作如下:

s[a-zA-Z]t

3.6.4如要匹配Computer或computer两个单词,可做如下操作:

[Cc]omputer

3.6.5要匹配所有包含system后跟句点的所有单词,这里S可大写或小写。使用如下操作:

[S,s] ystem\.

3.6.6注意^符号的使用,当直接用在第一个括号里,意指否定或不匹配括号里内容。

[^a-zA-Z]

//匹配任一非字母型字符

3.7使用\{\}匹配模式结果出现的次数

只要指定次数,就应使用 \ { \ },此模式有三种形式,即:

pattern\{n\} 匹配模式出现n次。

pattern\{n,\} 匹配模式出现最少n次。

pattern\{n,m} 匹配模式出现n到m次之间n,m为0-255中任意整数。

3.7.1匹配字母A出现两次,并以B结尾,操作如下:

A\{2\}B

//匹配值为AAB

3.7.2匹配A至少4次,使用:

A\{4 ,\}B

//可以得结果AAAAB或AAAAAAAB,但不能为AAAB。

3.7.3如给出出现次数范围,例如A出现2次到4次之间:

A\{2 ,4\}B

//则结果为AAB、AAAB、AAAAB,而不是AB或AAAAAB等。

 

4.总结

       在写正则表达式时,可能会有点难度或达不到预期效果,一个好习惯是在写真正的正则表达式前先写下预期的输出结果。这样做,当写错时,可以逐渐修改,以消除意外结果,直至返回正确值。接下来的文章介绍正则表达式在一些文本过滤工具的使用。

网上此书的目录很乱,而且一本书分割为好多文件。我详细整理了目录,并且合并为一个PDF文件。希望对大家有帮助。呵呵,这真的是一本好书《LINUXUNIX SHELL编程指南--------------------------------------------- 经典《LinuxUNIX Shell编程指南shell是一种完整的编程语言,易学易用;shell脚本可以使烦人的手工作业自动化,使你的工作变得简单、轻松!本书通过各种实用的系统管理小技巧和趣味脚本代码,详尽地介绍了shell编程各个不同的方面。学完本书后,你将成为一名shell编程高手。 内容简介 本书共分五部分 ,详细介绍了SHELL编程技巧,各种UNIX命令及语法,还涉及了UNIX的文字处理以及少量的系统管理问题。本书内容全面,文字简洁流畅,适合SHELL编程人员学习、参考。 目录 第一部分 SHELL 第一章 文件安全权限 第二章 使用FIND和XARGS 第三章 后台执行命令 第四章 文件名置换 第五章 SHELL输入输出 第六章 命令执行顺序 第二部分 文本过滤 第七章 正则表达式介绍 第八章 GERP家族 第九章 AWK介绍 第十章 SED用法介绍 第十一章 合并分割 第十二章 TR用法 第三部分 登录环境 第十三章 登录环境 第十四章 环境和SHELL变量 第十五章 小结 第四部分 基础SHELL编程 第十六章 SHELL脚本介绍 第十七章 条件测试 第十八章 控制流结构 第十九章 SHELL函数 第二十章 向脚本传递参数 第二一章 创建屏幕输出 第二二章 创建屏幕输入 第二三章 调试脚本 第二四章 SHELL嵌入命令 第五部分 高级SHELL编程技巧 第二五章 深入讨论 << 第二六章 SHELL工具 第二七章 几个脚本例子 第二八章 运行级别脚本 第二九章 CGI脚本
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值