正则表达式:正则表达式是以行为单位处理字符串的一种方法。它可以藉由一些特殊符号的使用,可以让使用者轻易达到“查找/删除/替换”某特定字符串的功能。
由于使用的语系中英文字母,数字的编码顺序不同,所以会对正则表达式的处理结果产生影响,所以我们在使用正则表达式时,都是使用兼容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指令才行。