正则表达式(Regular Expression,RE)是透过一些特殊字符的排列,用以[搜寻/取代/删除]一列或多列文字字符串,简单的说,正则表达式就是用在字符串的处理上面的一项“表达式”。如果想要以正则表达式的方式处理字符串,就要使用支持正则表达式的工具程序,例如 vi,grep,sed,awk等。但是像cp,ls等指令并不支持正则表达式,所以就只能使用bash自己本身的通配符。
注意:
- 正则表达式的符号与通配符是完全不一样的东西
因为通配符(wildcard)代表的是bash操作接口的一个功能,但正则表达式则是一种字符串处理的的表示方式。两者要分清楚啊~- 语系对正则表达式有影响
因此在使用正则表达式时,要特别留意当时环境的语系为何,否则可能会发现与别人不相同的撷取结果。
下面关于正则表达式的练习和举例,都使用我们熟悉的grep来展示,grep是一个撷取命令,如果你不了解grep,可以从这篇小文章里简单了解一些Linux 之 Bash -- 管线命令
grep 的一些进阶选项
之所以这么说,是因为Linux 之 Bash -- 管线命令里面都没有提到~~
工作模式:grep [-A] [-B] [--color=auto]'搜寻字符串' filename
-A
后面可加数字,为after的意思,除了列出该行外,后面的n行也列出来
-B
后面可加数字,为before的意思,除了列出该行外,前面的n行也列出来
--color=auto
可将正确的那个撷取数据列出颜色
1.基础正则表达式
下面总结了一个精简的基础正则表达式的字符表格,不过不要局限于其中的范例啊,还要根据实际情况灵活改变,它的价值可远不止于此~
表达式 | 描述 | 范例 |
---|---|---|
^ | 行首标记 | ^test 匹配以 test 起始的行 |
$ | 行尾标记 | test$ 匹配以 test 结尾的行 |
. | 任意字符 |
t.t 匹配任意代替. 的一个字母(它就是英文状态的句号),如txt,但不能是两个字母如text |
[] | 匹配其中任意一个 |
t[ex]t 匹配 tet 或 txt |
[^] | 除了其中任意一个 |
te[^xt] 除了 tet 和 txt 不能匹配,其他任意 |
[a-d] | 匹配指定范围内任一个 | 能匹配a,b,c,d中任意一个字母 |
{n} | 匹配之前n项 |
grep -w '[0-9]\{2\}' filename 撷取存在两位数字的文本行 |
{n,m} | 最少匹配n次,最多m次 |
[0-9]\{2,4\} 匹配2位数到4位数 |
{n, } | 至少匹配前面n次 |
[0-9]\{n, \} 匹配至少是两位数的 |
* | 匹配之前多个或没有 |
tx*t 匹配 tt 或 txt/txxt/txxxt/... |
\ | 转义(向来放在特殊符号前,* + ?等) | 如bio\ +info 匹配bio+info |
[^]
表示反向选择
[^a-z]
表示非小写字母
^[]
表示定位在行首
^[a-z]
表示行首非小写字母
^$
表示空白行
g..d
代表共4个字符,开头为g,结尾为d(.代表绝对有一个任意字符)
g.*g
代表g开头且g结尾的字符串
[0-9][0-9]*
表示任意数字
go\{2,5\}g
表示g后面接2-5个o和一个g的字符串(因为{}
在shell中有特殊意义,所以用\
来跳脱。这也是为什么👆表格的大括号{}
都写成了\{\}
)
ls -l . | grep '^l'
列出当前目录下的链接文档
(利用了链接文档的一个特性,其标头会是 lrwxrwxr)
再次提醒:正则表达式的 原字符
*
和 通配符*
不是一回事哦
- 通配符中,它代表0-无穷多个字符
- 正则表达式中,它代表匹配0-无穷多个的前一个RE字符
2.延伸正则表达
一般来讲,了解基础型的正则表达式已经能够帮助我们解决很多问题了。不过,某些时刻为了要简化整个指令操作,使用范围更广的延伸型正则表达会更加方便。
eg:延伸型正则表达可以透过群组功能‘|
’来进行一次搜寻,其中的管道符|
意义为“或 or”。不过,grep预设仅支持基础正则表达式,如果要使用延伸型正则表达,可以使用grep -E 或者 egrep。我觉得后者使用起来更方便哦(不用来回切换大小写~)
表达式 | 描述 | 范例 |
---|---|---|
+ | 匹配之前1个或多个 |
tx+t 匹配 txt 或 txxt/txxxt/... |
? | 匹配之前1个或没有 |
te?xt 只能匹配 txt 或 text |
| |
用或的方式找出字符串 |
gd|god|good 匹配gd,god,good |
() | 匹配括号中的字符串 |
bio(info)? 匹配 bio 或 bioinfo |
()+ | 多个重复群组的判别 |
A(xyz)+C 匹配AxyzC或AxyzxyzC等... |
网友评论