Linux - 正规表示法

正规表示法(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等...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章