您的位置:首页 > 运维架构 > Linux

Vbird的Linux私房菜学习笔记之正则表达式-特殊字符

2013-05-20 20:57 573 查看
正则表达式:正则表达式是以行为单位处理字符串的一种方法。它可以藉由一些特殊符号的使用,可以让使用者轻易达到“查找/删除/替换”某特定字符串的功能。
由于使用的语系中英文字母,数字的编码顺序不同,所以会对正则表达式的处理结果产生影响,所以我们在使用正则表达式时,都是使用兼容POSIX的标准。为了避免英文字母、数字编码的不同对字符截取产生的影响,底下的特殊字符需要牢记!
[:alnum:]英文字符和数字A-Z,a-z,0-9
[:alpha:]英文字符A-Z,a-z
[:digit:]数字0-9
[:xdigit:]16进制的数字0-9,A-F,a-f
[:upper:]大写英文字符A-Z
[:lower:]小写英文字符a-z
[ ]搜索集合字符
示例:
grep -n 'goo[dg]' /tmp/test.txt
此命令会显示出test.txt文件中包含good或goog字符串的行并显示行号;
'[]'表示[]内字符合集中的某一个字符,[a-z]表示一个小写英文字符,[0-9]表示一个数字字符。

反向选择符^
示例:
grep -n '[^a-z]ood' /tmp/test.txt
此命令会显示出test.txt文件中包含ood但ood前面不是小写英文字符的行,并显示行号;
为了避免由于语系字符编码的不同而导致的问题,此命令可以等同于:
grep -n '[^[:lower:]ood' /tmp/test.txt
注意此处'^'所处的位置是在集合字符[]内部

定位字符:行首符'^'和尾符'$'
示例:
grep -n '^first' /tmp/test.txt
此命令会显示出test.txt文件中包含first且first位于行首的行,并且显示行号;
注意此处'^'所处的位置不在集合字符[]内部
grep -n '^[^[:upper:]]' /tmp/test.txt
此命令会显示出test.txt文件中行首不是大写英文字符的行,并显示行号;
注意此命令中两个'^'的位置,以及它们表示的意思!!
grep -n ';$' /tmp/test.txt
此命令会显示出test.txt文件中以';'结尾的行,并显示行号;
grep -n '^$' /tmp/test.txt
此命令会显示出test.txt文件中的空行,并显示行号;

任意一个字符'.'和重复字符'*'
.(小数点):表示一定有一个任意的字符;
*(星号):重复前面的字符0到无穷次;
示例:
grep -n 't..t' /tmp/test.txt
此命令会显示出test.txt文件中包含以字符t开头和结尾并且中间有2个任意字符的行,并显示行号;
grep -n 'goo*g' /tmp/test.txt
此命令会显示出test.txt文件中包含以字符g开头和结尾并且中间有至少1个字符o的行,并显示行号;
grep -n 'g.*g' /tmp/test.txt
此命令会显示出test.txt文件中包含以字符g开头和结尾的行,并显示行号;

限定连续重复字符{}
由于shell中字符{}有特殊意义,所以在这里要使用转移字符\

示例:
grep -n 'go\{2\}g' /tmp/test.txt
此命令会显示test.txt文件中出包含字符串goog的行,并且显示行号;
grep -n 'go\{2,5\}g' /tmp/test.txt
此命令会显示test.txt文件中出包含字符串goog,gooog,goooog或gooooog的行,并且显示行号;
遗留问题:如何找出包含2个重复英文字符形如"aa"、"bb"的行,并显示行号;
此处要用到扩展正则表达式,命令如下:
egrep -ni '([a-z])\1' /tmp/test.txt
此处的'\1'表示反向引用前面圆括号内匹配的内容
常规正则表达式元字符总结:

[]字符合集中的任意一个字符,[abc]匹配a或b或c
[^]排除字符合集中的所有字符,[^abc]匹配除了a或b或c之外的字符
^行首符,^hello匹配以hello开头的行
$行尾符,hello$匹配以hello结尾的行
.匹配任意一个字符,g..d匹配g开头d结尾且中间有2个字符的字符串,如:good、glad、gadd
*匹配前导字符0到无穷次,goo*g匹配gog、goog、gooog....
\{n,m\}匹配前导字符n到m次;
\{n\}:匹配前导字符n次;
\{n,\}:匹配前导字符至少n次;
扩展正则表达式元字符:

+匹配前导字符1次或1次以上,go+g匹配gog、goog、gooog.....
?匹配前导字符0次或1次,go?g匹配gg、gog
|用or的方式找出数个匹配的字符串goog|hello|test匹配goog或hello或test
()找出群组字符串,g(oo|la)d匹配good或glad
()+匹配()内容1次或1次以上,(very)+good匹配verygood、veryverygood....
()\1反向引用()的内容,([a-c])\1匹配aa、bb、cc,即用()的内容代替\1
当然扩展正则表达式也需要工具程序的支持才能使用,比如grep就不支持扩展正则表达式,要用egrep指令才行。

本文出自 “凌乱的脚印” 博客,请务必保留此出处http://leohsiung.blog.51cto.com/7081290/1205098
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: