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