1.元字符'.'用来匹配一个任意字符
2.元字符''用来转义字符,与其他元字符在一起时,匹配元字符本身
3.元字符'[]'用来匹配一组字符中的任意一个,如'[abcd]',可以用元字符'-'来表示一个区间,例如'[A-Z]',在字符集合意外的地方,'-'字符表示一个普通的字符,不需要转义,在字符集合里面使用'^'表示取非,例如'',表示除数字之外的任意一个字符
4.匹配空白字符。Windows系统中'rnrn'匹配空白行,Linux系统中'nn'匹配空白行
5.匹配特定字符类别。'd'表示任意一个数字字符,'D'表示任意一个非数字字符,'w'任意一个数字、字母、下划线字符,'W'则相反,'s'匹配任意一个空白字符,'S'则相反。例如:
zhang@DESKTOP-CO960ET ~
$ echo "hello" | grep -P '\w'
hello
zhang@DESKTOP-CO960ET ~
$ echo "hello" | grep -P '\D'
hello
6.使用POSIX字符类。[:alnum:]匹配任意一个字母或数字;[:alpha:]匹配任意一个字母;[:blank:]匹配空格或制表符;[:cntrl:]匹配控制字符;[:digit:]匹配任意一个数字;[:lower:]匹配任意一个小写字母;[:space:]匹配任意一个空白字符;[:upper:]匹配任意一个大写字母;[:xdigit:]匹配任意一个十六进制数字,等价于[a-fA-F0-9]。例如:
zhang@DESKTOP-CO960ET ~
$ echo "sss" | grep -P '[[:xdigit:]]'
zhang@DESKTOP-CO960ET ~
$ echo "sssA" | grep -P '[[:xdigit:]]'
sssA
zhang@DESKTOP-CO960ET ~
$ echo "12_A" | grep -P '[[:lower:]]'
zhang@DESKTOP-CO960ET ~
$ echo "12_A" | grep -P '[[:upper:]]'
12_A
zhang@DESKTOP-CO960ET ~
$ echo "12_A" | grep -P '[[:digit:]]'
12_A
7.元字符'+'放在字符或字符集合后面用来匹配一个或多个字符,与''在一起时,用来匹配'+'本身。例如:
zhang@DESKTOP-CO960ET ~
$ echo "a2" | grep -P -o '\d+'
2
zhang@DESKTOP-CO960ET ~
$ echo "a" | grep -P -o '\d+'
zhang@DESKTOP-CO960ET ~
$ echo "a" | grep -P -o '[[:digit:]]+'
zhang@DESKTOP-CO960ET ~
$ echo "a2" | grep -P -o '[[:digit:]]+'
2
zhang@DESKTOP-CO960ET ~
$ echo "a2" | grep -P -o '[a2]+'
a2
zhang@DESKTOP-CO960ET ~
$ echo "a22" | grep -P -o '[a2]+'
a22
8.元字符'*'放在一个字符或字符集后面,就可以匹配该字符或字符集合连续出现零次或多次的情况,与''一起使用时,匹配自身;元字符'?'放在字符或字符集合后面时,在匹配一个字符的零次或1次出现,与''一起使用时,用来匹配自身。例如:
zhang@DESKTOP-CO960ET ~
$ echo "a" | grep -P '2*'
a
zhang@DESKTOP-CO960ET ~
$ echo "a" | grep -P '2?'
a
zhang@DESKTOP-CO960ET ~
$ echo "a" | grep -P '2+'
9.匹配的重复次数。元字符'{}'放在字符或字符集合后面,表示匹配的次数。具体:'{n}',表示匹配n次;'{n,m}'表示匹配次数为闭区间[n,m];'{n,}'表示匹配至少n次。与''一起使用时,表示'{'、'}'字符自身
10.防止过度匹配。贪婪型元字符''对应的懒惰型为'?','+'对应的为'+?','{n,}'对应的为'{n,}?'。区别见例子:
zhang@DESKTOP-CO960ET ~
$ echo "AAhelloAA and AAworldAA" | grep -P -o 'AA.*?AA'
AAhelloAA
AAworldAA
zhang@DESKTOP-CO960ET ~
$ echo "AAhelloAA and AAworldAA" | grep -P -o 'AA.*AA'
AAhelloAA and AAworldAA
zhang@DESKTOP-CO960ET ~
$ echo -e 'I paid $30 for 100 apples,\n50 oranges, and 60 pears.\nI saved $5 on this order' | grep -P -o '\d+'
30
100
50
60
5
zhang@DESKTOP-CO960ET ~
$ echo -e 'I paid $30 for 100 apples,\n50 oranges, and 60 pears.\nI saved $5 on this order' | grep -P -o '\d+?'
3
0
1
0
0
5
0
6
0
5
11.位置匹配。'b'匹配单词边界,这个位置位于一个能够用来构成单词的字符(字母、数字、下划线)和一个不能用来构成单词的之间。'B'表明不匹配一个单词边界,例如:
zhang@DESKTOP-CO960ET ~
$ echo "Hello cat hhcat sds" | grep -P -o '\bcat'
cat
zhang@DESKTOP-CO960ET ~
$ echo "Hello cat hhcat sds" | grep -P -o 'cat\b'
cat
cat
zhang@DESKTOP-CO960ET ~
$ echo "Hello cat hhcat sds" | grep -P -o '\bcat\b'
cat
zhang@DESKTOP-CO960ET ~
$ echo "nine-digit color - coded" | grep -P -o '\B-\B'
-
12.'^和'$'用来指定字符串的边界(字符串的开头和结束)。如果与'(?m)'配合使用,'^'和'$'还将匹配一个在换行符处开头或结束的字符串(此时,换行符被视为字符串分割符)
13.子表达式,用'()'括起来,其中'()'为元字符,匹配自身时,需要转移。子表达式表示对整个内容进行匹配。注意'(ab){2}'与'ab{2}'的区别,前者匹配'ab'整体出现2次,后者是'b'出现2次。子表达式允许嵌套。
14.回溯引用:前后一致匹配。指的是模式的后半部分引用在前部分中定义的子表达式。回溯引用匹配通常从1开始计数,例如:查找连续2次重复的单词
zhang@DESKTOP-CO960ET ~
$ echo -e "This is a block of of text,several words here are are repeated, and and they should not be" | grep -P -o '[ ]+(\w+)[ ]+\1'
of of
are are
and and
15.向前向后查找。向前查找指定了一个必须匹配但不在结果中返回的模式,语法上看向前查找实际上就是一个以'?='开头的子表达式,需要匹配的文字在'='后面。向后查找相反,查找出现在匹配文本之前的字符,但不包括它,向后查找操作符是'?<='。向前查找模式的长度是可变的,它可以包含'.'、'*'之类的元字符,而向后查找模式只能是固定长度。与向前向后查找相反分分别为负向前查找('?!')、负向后查找('?
zhang@DESKTOP-CO960ET ~
$ echo "http://www.baidu.com" | grep -P -o '.+(?=:)'
http
zhang@DESKTOP-CO960ET ~
$ echo "http://www.baidu.com" | grep -P -o '.+(:)'
http:
zhang@DESKTOP-CO960ET ~
$ echo 'AB42: $23.45' | grep -P -o '(?<=\$)[0-9.]+'
23.45
zhang@DESKTOP-CO960ET ~
$ echo 'AB42: $$23.45' | grep -P -o '(?<=\$+)[0-9.]+'
grep: lookbehind assertion is not fixed length
zhang@DESKTOP-CO960ET ~
$ echo "http://www.baidu.com" | grep -P -o '.+(?=t+)'
ht
zhang@DESKTOP-CO960ET ~
$ echo "<H1>HelloWorld<H1>" | grep -P -o '(?<=\<H1\>).*(?=\<H1\>)'
HelloWorld
zhang@DESKTOP-CO960ET ~
$ echo -e 'I paid $30 for 100 apples,\n50 oranges, and 60 pears.\nI saved $5 on this order' | grep -P -o '\b(?<!\$)\d+\b'
100
50
60
zhang@DESKTOP-CO960ET ~
$ echo -e 'I paid $30 for 100 apples,\n50 oranges, and 60 pears.\nI saved $5 on this order' | grep -P -o '\b(?<=\$)\d+\b'
30
5