Unix & Linux笔记(11)
来源:互联网 发布:域名审核通过以后 编辑:程序博客网 时间:2024/05/16 17:57
第20章 正则表达式
20.1 正则表达式简介
- 正则表达式
- regular expression,简写为
regex
或re
基本匹配的元字符
.
除新行字符外,匹配任意单个字符 ^
锚:匹配行的开头 $
锚:匹配行的末尾 \<
锚:匹配单词的开头 \>
锚:匹配单词的末尾 [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
往往只支持基本正则表达式。ERE和BRE之间的主要区别就是,对于BRE来说,有一些特定的元字符(?
、+
和|
)不能使用,而其他元字符必须使用反斜线引用{}
和()
。
BRE的主要限制:
(1) 花括号必须使用反斜线引用;
(2) 圆括号必须使用反斜线引用;
(3) 不能使用?
,但是可以使用\{0,1\}
模拟;
(4) 不能使用+
,但是可以使用\{1,\}
模拟;
(5) 不能使用|
;
(6) 不能使用预定义字符类。
20.4 匹配行和单词
- 锚(anchor)
- 特定的元字符,用来匹配在字符串的开头或末尾的位置。锚指定所查找模式的位置。
^
元字符是一个匹配行开头的锚。
查找空行
grep '^$' file | wc –l
在使用GNU实用工具的系统上,可以使用\b
(boundary 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 区域设置和排序序列:locale
;ASCII
码
C
排序序列- 字典排序序列
LO_COLLATE
20.8 使用范围和预定义字符类
在shell
脚本中建议使用预定义字符类,保证可移植性。
20.9 重复运算符
- 重复运算符
- repetition operator,最常见的组合就是使用一个
.
(点号),后跟一个*
,这将匹配任何字符的0
次或多次出现。
grep 'colou?r' file
在文件中查找包含2或3个数字的行 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}$'
- Unix & Linux笔记(11)
- Unix&Linux笔记(5)
- Unix & Linux笔记(6)
- Unix & Linux笔记(8)
- Unix & Linux 笔记(9)
- Unix & Linux 笔记(10)
- Unix & Linux 笔记(12)
- Unix & Linux笔记(14)
- Unix & Linux笔记(15)
- Unix & Linux笔记(16)
- Unix & Linux笔记(17)
- Linux笔记(5):UNIX 命令
- Linux/Unix笔记
- linux/unix实用笔记
- UNIX(LINUX)学习笔记
- Unix & Linux笔记(7)
- Unix & Linux笔记(13)
- Unix Linux笔记
- 今年的目标
- 二进制(2):浮点数
- SVM基础
- python入门神图
- ReactNative(五)——组件封装、样式定义、父子组件通过props传值
- Unix & Linux笔记(11)
- Finereport与Java Web
- CentOS7 根目录扩容
- Eclipse如果关闭了JavaScript、xml等文件的校验,我怎么人工去验证某个诸如xml文件格式是否有错误??
- 线性表的顺序存储结构
- spring+mybatis+ehcahce实现注解缓存
- JavaScript中的Function类型总结
- 牧羊曲
- 计算机中的布尔操作 ^ (即XOR)的学习