Unix & Linux笔记(11)

来源:互联网 发布:域名审核通过以后 编辑:程序博客网 时间:2024/05/16 17:57

第20章 正则表达式

20.1 正则表达式简介

正则表达式
regular expression,简写为regexre

基本匹配的元字符

元字符 含义 . 除新行字符外,匹配任意单个字符 ^ 锚:匹配行的开头 $ 锚:匹配行的末尾 \< 锚:匹配单词的开头 \> 锚:匹配单词的末尾 [list] 字符类:匹配list中的任何字符 [^list] 字符类:匹配不在list中的任何字符 () 组:视为一个单独的单元 | 交变:匹配选择之一 \ 引用:从字面上解释元字符

正则表达式是一种指定字符模式的简洁方式。在正则表达式中,普通字符匹配自身,特定的元字符拥有特殊的含义。

重复运算符

运算符 含义 * 匹配0次或多次 + 匹配1次或多次 ? 匹配0次或1{n} 限定:匹配n{n,} 限定:最少匹配n{0,m} 限定:最多匹配m{,m} 限定:最多匹配m{n,m} 限定最少匹配n次,最多匹配m

重复运算符用来匹配多个指定字符的实例。一些程序不支持{,m}因为它不是标准的。

预定义字符类

类 含义 类似于C [:lower:] 小写字母 a-z [:upper:] 大写字母 A-Z [:alpha:] 大小写字母 A-Za-z [:alnum:] 大小写字母、数字 A-Za-z0-9 [:digit:] 数字 0-9 [:punct:] 标点符号 - [:blank:] 空白符 -

注意,方括号和冒号都是名称的一部分。


20.2 正则表达式的起源


20.3 基本和拓展正则表达式

拓展正则表达式
extended regular expression 简称ERE
基本正则表达式
basic regular expression 简称BRE

sed往往只支持基本正则表达式。EREBRE之间的主要区别就是,对于BRE来说,有一些特定的元字符(?+|)不能使用,而其他元字符必须使用反斜线引用{}()
BRE的主要限制:

(1) 花括号必须使用反斜线引用;
(2) 圆括号必须使用反斜线引用;
(3) 不能使用?,但是可以使用\{0,1\}模拟;
(4) 不能使用+,但是可以使用\{1,\}模拟;
(5) 不能使用|
(6) 不能使用预定义字符类。


20.4 匹配行和单词

锚(anchor)
特定的元字符,用来匹配在字符串的开头或末尾的位置。锚指定所查找模式的位置。^元字符是一个匹配行开头的锚。

查找空行

grep '^$' file | wc –l

在使用GNU实用工具的系统上,可以使用\bboundary marker)作为\<\>的替代锚。


20.5 匹配字符;字符类

.(元字符) 匹配任何单个的字符。 grep 'Har..ly' file
通过将字符放在方括号[]中来指定搜索的字符串,这样的结构就称为一个字符类。严格的讲,字符类不包括方括号。

grep 'H[aA]' file

20.6 预定义字符类;范围

预定义字符类的规则:方括号是名称的一部分。因此,使用预定义字符类时必须包含第二组方括号,以维持正确的语法。

grep '21[:alpha:]' file

范围: grep '[3-7]' file

匹配不在特定字符类中的字符。在开头的左方括号后放一个^号即可。^充当一个否定操作符。下述命令搜索所有包含至少一个非字母字符的行:

grep '[^A-Za-Z]' filegrep '[^[:alpha:]]' file

理解复杂正则表达式的技巧就是记住每一个字符类——不管看上去多么复杂——只表示一个单独的字符


20.7 区域设置和排序序列:localeASCII

  • C排序序列
  • 字典排序序列
  • LO_COLLATE

20.8 使用范围和预定义字符类

shell脚本中建议使用预定义字符类,保证可移植性。


20.9 重复运算符

重复运算符
repetition operator,最常见的组合就是使用一个.(点号),后跟一个*,这将匹配任何字符的0次或多次出现。
grep 'colou?r' file

在文件中查找包含23个数字的行 gerp '\<[0-9]{3,7}\>' file

通过创建组,可以将一串字符视为一个单元。
连续匹配字符串"xyz"5(xyz){5}

为了查找完整的单词,需要明确匹配单词边界

grep '\<(cat|dog|bird|hamster)/>' file

反斜线


20.10 理解复杂正则表达式


20.11 解决3个有趣的难题;字典文件

1.那些单词以"qu"开头并以"y"结尾?

grep '^qu[a-z]+y$' /usr/share/dict/words

2.查找一个包含所有五个元音字母(顺序出现)的普通单词。

grep '^a[a-z]*e[a-z]*i[a-z]*o[a-z]*$' /usr/share/dict/words

3.在Unix系统中搜索两个字母的命令

ls /bin | grep '^[a-z]{2}$'
0 0
原创粉丝点击