正则表达式
正则表达式是一些用来匹配和处理文本的字符串。
正则表达式是你所定义的模式模板(pattern template )
正则表达式是通过正则表达式引擎是现实的,正则表达式引擎是一套底层软件,负责解释正则表达式模式并使用这些模式进行匹配
Linux
这里以Linux为例,介绍正则表达式
在Linux中,有两种流行的正则表达式引擎,大多数Linux工具至少实现了BRE引擎规范,能够识别该规范定义的所有模式符号,但是sed只符合BRE引擎规范的子集。
- POSIX基础正则表达式(basic regular expression)BRE,
- POSIX扩展正则表达式(extended regular expression)ERE,为常见的模式提供了更高级的使用,如gawk
在linux中可以看到使用awk和gawk的作用是一样的,因为awk是链接到gawk的,gawk是awk的GPL版
gawk程序可以使用大多数扩展正则表达式模式符号,并且能提供一些额外过滤功能,而这些功能是sed不具备的,正因为如此,gawk程序在处理数据流是比较慢。
使用场景
- 搜索 匹配文本
- 替换 匹配并替换
注意点
1.正则表达式使用字符串来匹配,匹配到的未必总是整个字符串,也可能是子串。如果需要匹配整个字符,需要用空格将开头或结尾隔开,或者指明行首行尾。
默认设置
1.绝大多数正则表达式引擎默认只返回一个匹配结果
2.区分大小写
匹配纯文本
/文本内容/
echo "thisis isis a test" | awk '/this/{print $0}'
thisis isis a test
echo "thisis isis a test" | sed -n '/this/p'
thisis isis a test
特殊字符
元字符时一些在正则表达式里有特殊含义的字符,如果需要匹配它们本身,需要在前面加斜杠表示转义,比如匹配 * \*
.*[]^${}\+?|()
元字符大致可以分为两类
- 匹配文本的,比如
.
- 正则表达式语法的组成部分,比如
[和]
特殊字符 | 描述 | 说明 |
---|---|---|
. | 匹配除了\n之外的任意单个字符 | BRE、ERE |
[] | 必须匹配[]其中的某个字符 | BRE 、ERE |
[] 匹配多个字符中的某一个
字符|描述
-|-|-
[] |必须匹配[]其中的某个字符
[-] | 表示字符区间(集合),如大写字母[A-Z]
[^] | 取反操作,不匹配[]中的某字符
适用于从全局看需要区分字母大小写,某个局部不需要区分字母大小写。
[]中字符的关系是or
如匹配子串含有RegEx和regex :[Rr]eg[Ee]x
XregEx也会被匹配,原因是默认匹配的不一定是整个字符串,可以是子串,如果需要匹配整个字符串需要限定位置
案例
test文件
sales.txt
order3.txt
na1.xls
na2.xls
sa1.xls
cal.xls
sam.xls
usal.xls
[ns]a..xls
a前面要有n或者s字符,
a后面需要跟一个任意字符
.xls 任意字符的后面要跟着.xls
[ranan@MPI0 ~]$ cat test | sed -n '/[ns]a.\.xls/p'
na1.xls
na2.xls
sa1.xls
sam.xls
usax.xls # 这个也被匹配到了,这里涉及之前说的位置匹配
[-]连字符表示字符区间
-只有出现在[-]里的时候才是元字符,在其他地方只是普通字符,表示字符-(它本身)。所以匹配-时是不需要转移的
案例
假设我们的需求是a后面不是跟任意字符了需要跟数字,也就是说不匹配上述的sam.xls
[0-9] 与[0123456789]完全等价
[ranan@MPI0 ~]$ cat test | sed -n '/[ns]a[1-9]\.xls/p'
na1.xls
na2.xls
sa1.xls
常用的字符区间
A-Z 匹配从A到Z的所有大写字母
a-z 匹配从a到z的所有小写字母
A-z 批评日从ASCII字符A到ASCII字符z之间的所有字母,这个模式不常用应为还包含[和^等在ASCII表中排列在Z和a之间的字符
在一个字符集合里可以给出多个字符区间,如果需要匹配任意字符,使用[A-Za-z]
[^] 排除
[^]在[]中表示排除指定的字符
当需要匹配很多的字符,仅仅排除很少的字符时使用
案例
假设我们需要匹配a后面不是数字的字符串
[ranan@MPI0 ~]$ cat test | sed -n '/[ns]a[^1-9]\.xls/p'
sam.xls
usal.xls
. 匹配任意单个字符
匹配除换行符\n之外的任意单个字符,包括本身。
如果指向匹配.,使用\.
空白元字符
空白元字符 | 说明 |
---|