天天看点

基础正则表达式字符及用法

一、什么是正则表达式

简单的说,正则表达式就是处理字符串的方法,是以行为单位来进行字符串的处理行为,通过一些特殊字符的辅助,用以查找、替换、删除某特定字符串的处理程序。

二、语系对正则表达式的影响

我们知道,我们看到的字符文字与数字都是通过编码表转化而来的。由于不同语系的编码表是不相同的,所以会造成数据选取结果的不同。

举个例子,在英文大小写的编码顺序中,zh_CN.big5及C这两种语系的输出结果分别入下:

LANG=C: 0 1 2 3 4……A B C……a b c……z

LANG=zh_CN: 0 1 2 3 4……a A b B……z Z

所以,在使用正则表达式时,需要注意当时环境的语系是什么,否则会影响选取结果。 

下面介绍一些特殊符号的含义:

基础正则表达式字符及用法

三、grep的一些高级参数

grep [-A] [-B] [–color=auto] ‘搜索字符串’ filename

参数:

-A:后面可加数字,除了列出该行外,后序的n行也列出来

-B:前面可加数字,除了列出该行外,前面的n行也列出来

–color=auto可将正确的那个选取数据列出颜色

eg:用dmesg列出内核信息,用grep找出内含eth的那行。

基础正则表达式字符及用法

四、基础正则表达式字符(例子见下文)

1、待查找的字符串(word)在行首

RE字符:^word

范例 :查找行首为#开始的那一行,并列出行号(grep 后带 -n 的作用)

命令 :grep -n '^#' regular_express.txt

2、待查找的字符串(word)在行尾

RE字符:word$

范例 :将行尾为!的那一行打印出来,并列出行号

命令 :grep -n '!$' regular_express.txt

3、代表一定有一个任意字符的字符

RE字符:.

范例  :查找的字符串可以是(eve)(eae)(eee)(e e),但不能有(ee)!即e与e中间一定“有且仅有”一个字符,而空格也是字符

命令 :grep -n 'e.e' regular_express.txt

4、转义字符,将特殊符号(比如^  $  .  \  *  [  ]等等)的特殊意义去除

RE字符:\

范例  :查找含有单引号'的那一行

命令 :grep -n '\'' regular_express.txt    #注意\后面是两个单引号,而非一个双引号

5、重复零个到无穷多个的前一个字符

RE字符:*

范例 :找出含有(es)(ess)(esss)等的字符串,注意,因为*可以是0个,所以 es 也是符合待查找字符串。另外,因为 * 为重复“前一个RE字符”的符号,因此,在*之前必须紧接着一个RE字符。例如任意字符则为".*"(注意星号前面是一个英文句号,因为英文句号代表“有且仅有一个任意字符”)。

命令 :grep -n 'ess*' regular_express.txt     #因为*可以是0个,所以 es 也是符合待查找字符串

6、从字符集合的RE字符里面找出想要选取的字符

RE字符:[list]

范例:查找含有(gl)或(gd)的那一行,需要特别留意的是,在[]当中代表一个待查找的字符,例如"a[afl]y"代表查找的字符串可以是aay、afy、aly,即[afl]代表的是a或f或l的意思。

命令 :grep -n 'g[ld]' regular_express.txt

7、从字符集合的RE字符里面找出想要选取的字符范围

RE字符:[n1-n2]

范例:查找含有任意数字的那一行。需要特别注意的是,在字符集合[ ]中的减号-是有特殊意义的,它代表两个字符之间的所有连续字符。 但这个连续与否与ASCII编码有关,因此,你的编 码需要设置正确(在bash当中,需要确定LANG与LANGUAGE的变量是否正确)!例如所有大写字符则为[A-Z]。

命令      :grep -n '[0-9]' regular_express.txt   #查找含有任意数字的那一行

grep -n '[A-Z]' regular_express.txt   #查找含有任意大写字母的那一行

8、从字符集合的RE字符里面找出不要的字符串或范围

RE字符:[^list]

范例 :查找的字符串可以是(oog)(ood)但不能是(oot),那个^在[ ]内代表的意义是”反向选择“的意思。例如,我不要大写字母,则为[^A-Z]。但是,需要特别注意的是,如果以 grep -n [^A-Z] regular_express.txt 来查找,却发现该文件内的所有行都被列出,为什么?因为这个[^A-Z]是”非大写字符“的意思,因为每一行均有非大写字母。

命令      :grep -n 'oo[^t]' regular_express.txt

9、连续n到m个的前一个RE字符,若为\{n\}则是连续n个的前一个RE字符,若为\{n,\}则是连续n个以上的前一个RE字符

RE字符:\{n,m\}

范例 :在g与g之间有2个到3个的o存在的字符串,即(goog)(gooog)

命令 :grep -n 'go\{2,3\}g' regular_express.txt

五、基础正则表达式练习

我们用例题感受理解一下正则表达式。

下面用的文件是在鸟哥的网站下下载的,如下命令:

基础正则表达式字符及用法

例题1、查找特定字符串

比如含有’the’这个特定的字符串:

基础正则表达式字符及用法

查找不含“the”字符串

基础正则表达式字符及用法

不论大小写的“the”这个字符串

基础正则表达式字符及用法

例题二:利用中括号[]查找集合字符

如果我想要查找test与taste两个单词有共同点是,都含有’t?st’ ,可以这样来查找。

基础正则表达式字符及用法

查找含oo的字符:

基础正则表达式字符及用法

但是,不想要前面有g的话,可以利用在集合字符的反向选择[^]来完成:

基础正则表达式字符及用法

例题3:行首与行尾字符^$

当我们需要查询的字符只在行首列出,这个时候可以使用制表符了:

基础正则表达式字符及用法

证明只有12行是the开头的。

查找第一个字符以a~z开头的:

基础正则表达式字符及用法

查找第一个字符是大写的 :

基础正则表达式字符及用法

查找第一个字符是小

写的:

基础正则表达式字符及用法

^在字符集合符号[]之内和之外是不同的,在[]之内表示反向选择,在[]之外表示定位在行首。

那么行尾呢?

行尾结束为小数点.的那一行

基础正则表达式字符及用法

小数点具有其他的意义,所以我们使用转义字符\来解除特殊意义。

查找空白行:

基础正则表达式字符及用法

例题4:任意一个字符.与重复字符

注意正则表达式并不是通配符,我们需要了解正则表达式中的几个符号:

.(小数点):一定有一个任意字符

*(星号):重复前一个0到无穷多次,为组合形态

我们通过例子了解:

查找g??d的字符串 ,即开头是g结束是d:

基础正则表达式字符及用法

o*代表具有空字符串或一个o以上的字符,则会将所有的结果打印出来

oo*代表第一个o必须存在,第二个o可有可无

ooo*查找含有至少两个以上oo的字符串

如下:

基础正则表达式字符及用法

查找字符串开头结尾都是g的:

基础正则表达式字符及用法

查找以g开头和结尾的字符串所在的行,但中间的字符可有可无

基础正则表达式字符及用法

例题5:限定连续RE字符范围{}

因为{}在shell中有特殊意义,我们必须用转义字符来让它失去特殊意义

如果查找两个o的字符串

继续阅读