正则表达式(笔记)
正规表示法《鸟哥的linux私房菜》
正规表示法(RegularExpression),有叫正则表达式。简单的说,正规表示法就是处理字符串的方法。 首先要理解一下下面的符号: [:alnum:]代表英文大小写字符及数字,亦即0-9,A-Z,a-z [:alpha:]代表任何英文大小写字符,亦即[:blank:]代表空格和tab键 [:cntrl:]代表键盘上的控制按键,包括CR,LF,Tab,Del等等 [:digit:]代表数字,亦即0-9 [:graph:]代表空格(空格键和tab键)外的其他所有按键 [:lower:]代表小写字符,亦即[:print:]代表任何可以被打印的字符 [:punct:]代表标点符号(punctuationsymbol) [:upper:]代表大写字符,亦即A-Z [:space:]代表任何会产生空白的字符,空格,tab,CR等 [:xdigit:]代表16进位的数字类型,因此包括:0-9,a-f,A-F
我们通过使用grep命令来学习正则表达式,grep是一个很常见的指令,其功能是进行字符串数据的比对,然后将符合用户需求的字符串打印出来下面是grep命令的使用方法: grep[-A] [-B] [--color=auto] '搜寻字符串'filename -A:后面可以加数字,=after,除了列出该行外,后续的n行也列出来; -B:后面可以加数字,=before,除了列出该行外,前面的--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-5个o,在接一个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'
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |