一、正则表达式元字符含义
^abc 匹配以abc开头的行。
abc$ 匹配以abc结尾的行。
. 匹配除了换行符以外的任意的单个字符。
? 匹配前面的子表达式0次或1次。如"a?"表示匹配0个或1个"a"。
* 匹配前面的子表达式0次或多次。如"a*"表示匹配0个或多个"a"。
+ 匹配前面的子表达式1次或多次。如"a\+"表示匹配1个或多个"a"
#### 注意:这里的shell脚本将"+"作为普通字符,"\+"则转移为元字符,而有些语言则直接将"+"作为元字符。
.* 任意多个字符,可以理解为0个或者多个(.),也就任意多个字符。
[ ] 匹配中括号里的任意指定字符,但只匹配一个字符。如"[a]"匹配"a","[a-c]"匹配"a"或"b"或"c"。
[^ ] 匹配中括号里的字符之外的任意一个字符。如"[^a]"匹配除"a"之外的字符。
{n} 匹配前面的子表达式n次。如"as\{2\}",匹配"ass"。
{n,} 匹配前面的子表达式大于或者等于n次。如"as\{2,\}",匹配"ass"或"asss"等。
{n,m} 匹配前面的子表达式n至m次。如"as\{1,2\}",匹配"as"和"ass"。
{,m} 匹配前面的子表达式0至m次。如"as\{,2\}",匹配"a"、"as"和"ass"。
#### 注意:shell脚本是将"{"和"}"作为普通字符的,因此以上表达式要作为元字符处理则要在"{"和"}"前加上"\"。
\ 转义字符,将下一个字符标记为特殊字符(如果为元字符)或元字符(如果为普通或特殊字符)。
\f 匹配一个换页符。
\n 匹配一个换行符。
\r 匹配一个回车符。
\t 匹配一个制表符。
\v 匹配一个垂直制表符。
\w 匹配字母、数字和下划线,不匹配符号。等价于[A-Za-z0-9_]。
\W \w的反匹配方式。等价于[^A-Za-z0-9_]。
\b 匹配单词边界,也就是指单词和空格间的位置。如"rd\b"可匹配"word ",但不能匹配"words "。
\B 匹配非单词边界。如"rd\B"可匹配"words ",但不能匹配"word "。
\s 匹配任意空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
\d 匹配一个数字字符。等价于[0-9]。
\D 匹配一个非数字字符。等价于[^0-9]。
二、以grep匹配a文件来演示正则表达式
hollowman@hollowman-F117:~$ cat a ##查看a文件内容
abcdefgabc
defgabc
last last last
castcastcast
rust rust rust
abc123def
-abc
_abc
@abc
a
aa
aaa
aaaa
[ ] { } ( ) . * ^ $ ? +
hollowman@hollowman-F117:~$ cat a | grep "^abc" #匹配abc开头的行,匹配的字符会以红色字样打印出来。
abcdefgabc
abc123def
hollowman@hollowman-F117:~$ cat a | grep "abc$" #匹配abc结尾的行。
abcdefgabc
defgabc
-abc
_abc
@abc
hollowman@hollowman-F117:~$ cat a | grep "l.*t" #匹配l开头,t结尾。
last last last
hollowman@hollowman-F117:~$ cat a | grep "a*st" #匹配0个以上的"a"再加上"st"。
last last last
castcastcast
rust rust rust
hollowman@hollowman-F117:~$ cat a | grep "a\+st" #匹配1个以上的"a"再加上"st"。
last last last
castcastcast
hollowman@hollowman-F117:~$ cat a | grep "[r_\@]" #匹配"r"、"_"、"@"中的任意一个字符。
rust rust rust
_abc
@abc
hollowman@hollowman-F117:~$ cat a | grep "[^a-z 0-9]" #匹配"a-z",空格,"0-9"之外的字符
-abc
_abc
@abc
[ ] { } ( ) . * ^ $ ? +
hollowman@hollowman-F117:~$ cat a | grep "a\{3,4\}" #匹配"aaa"和"aaaa"字符,也就是3至4次"a"字符
aaa
aaaa
hollowman@hollowman-F117:~$ cat a | grep "st\b" #匹配"st"作为单词边界的字符串
last last last
castcastcast
rust rust rust
hollowman@hollowman-F117:~$ cat a | grep "st\B" #匹配"st"不作为单词边界的字符串
castcastcast