正则表达式(笔记)

来源:互联网 发布:淘宝口令变成链接 编辑:程序博客网 时间:2024/05/21 09:37

正规表示法《鸟哥的linux私房菜》


正规表示法(RegularExpression),有叫正则表达式。简单的说,正规表示法就是处理字符串的方法。

首先要理解一下下面的符号:

[:alnum:]代表英文大小写字符及数字,亦即0-9A-Za-z

[:alpha:]代表任何英文大小写字符,亦即A-Za-z

[:blank:]代表空格和tab

[:cntrl:]代表键盘上的控制按键,包括CR,LF,Tab,Del等等

[:digit:]代表数字,亦即0-9

[:graph:]代表空格(空格键和tab键)外的其他所有按键

[:lower:]代表小写字符,亦即a-z

[:print:]代表任何可以被打印的字符

[:punct:]代表标点符号(punctuationsymbol)

[:upper:]代表大写字符,亦即A-Z

[:space:]代表任何会产生空白的字符,空格,tabCR

[:xdigit:]代表16进位的数字类型,因此包括:0-9a-fA-F

我们通过使用grep命令来学习正则表达式,grep是一个很常见的指令,其功能是进行字符串数据的比对,然后将符合用户需求的字符串打印出来下面是grep命令的使用方法:

grep[-A] [-B] [--color=auto] '搜寻字符串'filename

-A:后面可以加数字,=after,除了列出该行外,后续的n行也列出来;

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

--color=auto可以将正确抓取的数据列出颜色。


1.搜寻特定的字符串

grep-n 'the' reg.txt表示在名为reg.txt文件里搜寻带有'the'的那一行,-n表示标出行数。

反向搜寻,当该行没有'the'字符串时,显示该行

grep-vn 'the' reg.txt

取得不论大小写的'the'字符串

grep-in 'the' reg.txt

2.利用中括号[]来搜寻集合字符串

要搜寻'test''taste'两个字符串,可以发现它们都含有't?st'存在,则可以这样搜寻

grep-n 't[ae]st' reg.txt

由上一条指令可以知道,不管[]中有几个字符,都代表一个字符,表示a或者e的意思。

搜寻含有'oo'字符时

grep-n 'oo' reg.txt

如果不希望'oo'前面有字符g的话,可以利用在集合字符的反向选择[^]来达成:

grep-n '[^g]oo' reg.txt

如果不希望'oo'前面有小写字母,使用正则表达式:

grep-n '[^a-z]oo' reg.txt

如果希望取得含有数字的一行

grep-n '[0-9]' reg.txt或者 grep-n '[:digit:]' reg.txt

3.行首与行尾字符

想要打印行首为'the'的那一行

grep-n '^the' reg.txt

打印行首为小写字母的数据行

grep-n '^[a-z]' reg.txt或者 grep-n '^[[:lower:]]' reg.txt

打印行首不为英文字母的数据行

grep-n '^[a-zA-Z]' reg.txt或者 grep-n '^[^[:alpha:]]' reg.txt

打印行尾为小数点的数据行

grep-n '\.$' reg.txt使用\跳脱小数点

搜寻空白行

grep-n '^$' reg.txt

grep-v '^$' reg.txt|grep -v '^#'代表不要空白行,不要行首为#的数据行

4.任意一个字符.与重复字符*

bash当中,通配符*可以用来代表(0或多个)字符,但正则表示法不同。

.小数点:代表‘一定有一个任意字符’的意思;

*星号:代表‘重复前一个0到无穷多次’的意思,为组合形态

例如,找出含有'g??d'的字符,即共有四个字符,字符以g开头,d结尾

grep-n 'g..d' reg.txt其中,一个小数点代表一个任意字符

*代表‘重复0个或多个前面的任意字符’,所以o*代表:拥有空字符或者一个o以上的在哦符,注意,因为允许空字符(没有字符也可以),因此grep-n 'o*' reg.txt 会把所有数据都打印出来。

oo*,表示第一个o必须存在,第二个o可以没有,也可有有无穷多个,所以只要含有o字符的数据行都会被打印

如果需要打印至少含有两个o的字符串,需要ooo*

如果,字符串开头和结尾都是g,两个g之间治沙存在一个o,如何打印?

grep-n 'goo*g' reg.txt

打印字符串开头结尾为g,中间可有可无其他字符:

grep-n 'g.*g' reg.txt

打印含有任意数字字符的数据:

grep-n '[0-9][0-9]*' reg.txt或者grep-n '[[:digit:]]' reg.txt

5.限定连续任意字符范围{}

上面的例子中,我们可以使用小数点,任意字符即*来设定0到无限多个重复字符,那如何限制一个范围内区间内的重复字符呢?使用{}字符。由于{}两个符号在shell中有特殊意义,我们必须用跳脱字符\来使其跳脱。例如,要寻找两个o的字符串:

grep-n 'o\{2\}' reg.txt

要搜寻g后面接2-5o,在接一个g的字符串:

grep-n 'go\{2,5\}g' reg.txt

如果要搜寻两个以上的o

grep-n 'go\{2,\}g' reg.txt或者 grep-n 'gooo*g' reg.txt

强调:正规表示法的特殊字符和一般在指令列输入指令的通配符不一样,比如在通配符中*代表0到无限多个字符,在正规表示法中,*代表重复0到无限多个前一个字符。

指令ls并不支持正规表示法,ls-l * 代表任意档案名的档案,而ls-l a*代表以a为开头的任何档案名的档案。如果搭配支持正规表示法的工具,寻找以a开头的档案:ls| grep '^a'

例题:用ls-l配合grep寻找/etc/底下的文件类型为链接文件属性的文件名

答:符合条件的文件表头为:lrwxrwxrwx

则指令可写为:ls-l /etc | grep '^l'


0 0
原创粉丝点击