近期研读 伍之昂老师 的<<Linux Shell编程从初学到精通>>,这里当做自己的学习笔记.
元字符:元字符(Metacharacters)是用来阐释字符表达式意义的字符,简言之,元字符就是描述字符
的字符,它用于对字符表达式的内容、转换及各种操作信息进行描述。
正则表达式:正则表达式是由一串字符和元字符构成的字符串,简称RE(Regular Expression)。正
则表达式的主要功能是文本查询和字符串操作,它可以匹配文本的一个字符或字符集合。实际上,正
则表达式完成了数据过滤,将不满足正则表达式定义的数据拒绝掉,剩下与正则表达式匹配的数据。
POSIX 标准将正则表达式分为两类:基本的正则表达式和扩展的正则表达式。
基本的正则表达式
基本的正则表达式元字符集合及其意义:
下面逐个介绍正则表达式元字符的意义和用法,并举一些例子结合使用元字符集合。
1."*"符号
"*"符号用于匹配前面一个普通字符的0 次或多次重复,如:
1
|
hel*o |
"*"符号前面的普通字符是l,*字符就表示匹配l 字符0 次或多次,如字符串heo、helo、hello、hellllllo都可以由hel*o来表示。
2."."符号
点号"."用于匹配任意一个字符,如:
1
|
…73. |
由于"."符号只能匹配一个字符,因此,上述字符串表示前面三个字符为任意字符,第4 和第5 个字符是7和3,最后一个字符为任意字符,如xcb738、4J973U都能匹配上述字符串。值得注意的是,"."符号可以匹配一个空格,因此,x b738、ui 73e也能匹配上述字符串。
3."^"符号
"^"符号用于匹配行首,表示行首的字符是"^"字符后面的那个字符,如:
1
|
^cloud |
这表示匹配以cloud开头的行。结合上面介绍的"*"符号和"."符号,再举一个例子:
1
|
^…X86* |
该字符串表示行首的三个字符为任意字符(可以是空格),第4~6 个字符为X86,第7个字符开始可以重复匹配6,如:866X86666、8 6X86都可以匹配上述字符串。
4."$"符号
$符号匹配行尾,$符号放在匹配字符之后,与"^"符号的功能和用法都相反,如:
1
|
micky$ |
该正则表达式表示匹配以micky结尾的所有行。一个特殊的正则表达式是匹配所有空行的表达式,为:
1
2
|
#代表一个空行 ^$ |
该正则表达式既匹配行首,又匹配行尾,中间没有任何字符,因此,为空行。需要牢记空行表示方法,很多命令都用到这个正则表达式来表示空行。
如果需要匹配只包含一个字符的行,如下所示:
1
|
^.$ |
5."[]"符号
方括号[]匹配字符集合,该符号支持穷举方法列出字符集合的所有元素,也支持使用"-"符号表示字符集合范围,表明字符集合范围从"-"左边字符开始,到"-"右边字符结束。如果要匹配任意一个数字,可以使用如下所示的两种方法,前一种穷举了阿拉伯数字,后一种用数字范围表示,显得比较简洁。
1
2
3
4
|
#穷举方法列出字符集合 [0123456789] #使用"-"来表示集合范围 [0-9] |
"[]"也可以用做字母匹配,如下所示:
1
2
3
|
[a-z] #所有小写字母
[A-Z] #所有大写字母
[b-p] #小写字母b~p
|
Linux 系统对大小写是敏感的,并且支持字母排序,因此,Linux 中有大写字母序列和小写字母序
列,两者是分开的,a~z 表示所有的小写字母,A~Z 表示所有的大写字母,而b~p表示从b到p之间
所有的小写字母。
我们知道,"^"符号表示匹配行首,但是,"^"符号放到"[]"符号中就不再表示匹配行首了,而是表示
取反符号,请看下面例子:
1
|
[^b-d] |
"[^b-d]" 正则表达式匹配不在b~d范围之内的所有字符,此时,符号"^"不再表示匹配行首,而是取
反符号,不在b~d范围内的字符实际上涵盖了除了小写字母b、c和d之外的所有字符(包括其他字母、
数字、空格等)。再举一个"[]"符号和"*"符号结合的例子。
1
|
[A-Za-z] [A-Za-z]* |
上诉正则表达式表示以任意一个字母开头,再以任意字母进行0 次或任意次重复,实际上,这个正则表达式可以匹配任意英文单词。
6."\"符号
"\"符号是转义符,用于屏蔽一个元字符的特殊意义,即以字面含义来解释"\"符号后面的元字符,如:
1
2
|
#转义符号屏蔽元字符"."的特殊含义 \. |
7."\<\>"符号
"\<\>"符号是精确匹配符号,该符号利用"\"符号屏蔽"<>"符号,如:
1
|
\<the\> |
该正则表达式精确匹配the 这个单词,而不匹配包含the 字符的单词,如them、there、another 等。
8."\{\}"系列符号
"\{\}"系列符号与"*"符号类似,都是表示前一个字符的重复。但是,"*"符号表示重复0 次或任意次,而"\{\}"系列符号可以指定重复次数,"\{\}"系列符号包括以下三种形式。
\{n\}:匹配前面字符出现n次。
\{n,\}:匹配前面字符至少出现n次。
\{n,m\}:匹配前面字符出现n~m次。
请看如下例子:
1
2
3
4
|
#\{\}系列符号的用法 JO\{3\}B #重复字符O 3 次
JO\{3,\}B #重复字符O 至少3次
JO\{3,6\}B #重复字符O 3~6次
|
JO\{3\}B表示重复字符O 3次,匹配值为:JOOOB。
JO\{3,\}B 表示重复字符O 至少3 次,JOOOB、JOOOOB、JOOOOOB 等字符串都可由该正则表达式来匹配。
JO\{3,6\}B表示重复字符O 至少3 次,至多6次,JOOOB、JOOOOOOB等字符串都满足,但是JOOB、JOOOOOOOB等字符串就不满足。
再举一个例子:
1
2
|
#精确匹配5个小写字母 [a-z] \{5\} |
上诉正则表达式表示精确匹配5个小写英文字母,比如hello、house等。
扩展的正则表达式
除基本的正则表达式的元字符之外,awk 和Perl 等Linux 工具还支持正则表达式扩展出来的一些元字符,如下所示
扩展的正则表达式元字符集合及其意义:
下面详细介绍扩展的正则表达式元字符及其用法。
1."?"符号
匹配"?"符号之前的那个字符0 次或1 次,如:
1
2
|
#?符号的意义 JO?B |
该表达式表示匹配O 字符0次或1 次,即匹配JB、JOB、JOOB等。需要注意的是,"?"字符至多可以匹配1 个字符。
2."+"符号
与"*"符号类似,都是匹配其前面的那个字符多次,但是,"*"符号可以匹配0次,而"+"符号至少匹配1 次,如:
1
2
|
#+符号的意义 S+EU |
该表达式表示匹配S 1 次或任意次,SEU、SSEU、SSSSEU 等字符串都可由该表达式进行匹配。
3."()"符合和"|"符号
"()"符号通常与"|"符号结合使用,表示一组可选字符的集合,如:
1
2
|
#()符号和|符号的意义 re(a|e|o)d |
该表达式中的(a|e|o)表示在字符a、e 和o 中选择任意一个字符,即read、reed、reod 都可由该表达式进行匹配。
事实上,()符号很少使用到,因为"[]"符号完全能够替代"()"符号表示一组可选字符的集合,re(a|e|o)d就等价于re[aeo]d。
"|"符号也可以表示多个正则表达式的"或"关系,基本格式为:
RE1 | RE2 | RE3 |…
上述格式中,RE1、RE2和RE3表示正则表达式。
"|"符号在扩展的正则表达式中表示"或"意义,遗憾的是,"|"符号的这种用法却很少被人记住,"|"符号最著名的是其管道符用法。
本文转自marbury 51CTO博客,原文链接:近期研读 伍之昂老师 的<<Linux Shell编程从初学到精通>>,这里当做自己的学习笔记.
元字符:元字符(Metacharacters)是用来阐释字符表达式意义的字符,简言之,元字符就是描述字符
的字符,它用于对字符表达式的内容、转换及各种操作信息进行描述。
正则表达式:正则表达式是由一串字符和元字符构成的字符串,简称RE(Regular Expression)。正
则表达式的主要功能是文本查询和字符串操作,它可以匹配文本的一个字符或字符集合。实际上,正
则表达式完成了数据过滤,将不满足正则表达式定义的数据拒绝掉,剩下与正则表达式匹配的数据。
POSIX 标准将正则表达式分为两类:基本的正则表达式和扩展的正则表达式。
基本的正则表达式
基本的正则表达式元字符集合及其意义:
下面逐个介绍正则表达式元字符的意义和用法,并举一些例子结合使用元字符集合。
1."*"符号
"*"符号用于匹配前面一个普通字符的0 次或多次重复,如:
1
|
hel*o |
"*"符号前面的普通字符是l,*字符就表示匹配l 字符0 次或多次,如字符串heo、helo、hello、hellllllo都可以由hel*o来表示。
2."."符号
点号"."用于匹配任意一个字符,如:
1
|
…73. |
由于"."符号只能匹配一个字符,因此,上述字符串表示前面三个字符为任意字符,第4 和第5 个字符是7和3,最后一个字符为任意字符,如xcb738、4J973U都能匹配上述字符串。值得注意的是,"."符号可以匹配一个空格,因此,x b738、ui 73e也能匹配上述字符串。
3."^"符号
"^"符号用于匹配行首,表示行首的字符是"^"字符后面的那个字符,如:
1
|
^cloud |
这表示匹配以cloud开头的行。结合上面介绍的"*"符号和"."符号,再举一个例子:
1
|
^…X86* |
该字符串表示行首的三个字符为任意字符(可以是空格),第4~6 个字符为X86,第7个字符开始可以重复匹配6,如:866X86666、8 6X86都可以匹配上述字符串。
4."$"符号
$符号匹配行尾,$符号放在匹配字符之后,与"^"符号的功能和用法都相反,如:
1
|
micky$ |
该正则表达式表示匹配以micky结尾的所有行。一个特殊的正则表达式是匹配所有空行的表达式,为:
1
2
|
#代表一个空行 ^$ |
该正则表达式既匹配行首,又匹配行尾,中间没有任何字符,因此,为空行。需要牢记空行表示方法,很多命令都用到这个正则表达式来表示空行。
如果需要匹配只包含一个字符的行,如下所示:
1
|
^.$ |
5."[]"符号
方括号[]匹配字符集合,该符号支持穷举方法列出字符集合的所有元素,也支持使用"-"符号表示字符集合范围,表明字符集合范围从"-"左边字符开始,到"-"右边字符结束。如果要匹配任意一个数字,可以使用如下所示的两种方法,前一种穷举了阿拉伯数字,后一种用数字范围表示,显得比较简洁。
1
2
3
4
|
#穷举方法列出字符集合 [0123456789] #使用"-"来表示集合范围 [0-9] |
"[]"也可以用做字母匹配,如下所示:
1
2
3
|
[a-z] #所有小写字母
[A-Z] #所有大写字母
[b-p] #小写字母b~p
|
Linux 系统对大小写是敏感的,并且支持字母排序,因此,Linux 中有大写字母序列和小写字母序
列,两者是分开的,a~z 表示所有的小写字母,A~Z 表示所有的大写字母,而b~p表示从b到p之间
所有的小写字母。
我们知道,"^"符号表示匹配行首,但是,"^"符号放到"[]"符号中就不再表示匹配行首了,而是表示
取反符号,请看下面例子:
1
|
[^b-d] |
"[^b-d]" 正则表达式匹配不在b~d范围之内的所有字符,此时,符号"^"不再表示匹配行首,而是取
反符号,不在b~d范围内的字符实际上涵盖了除了小写字母b、c和d之外的所有字符(包括其他字母、
数字、空格等)。再举一个"[]"符号和"*"符号结合的例子。
1
|
[A-Za-z] [A-Za-z]* |
上诉正则表达式表示以任意一个字母开头,再以任意字母进行0 次或任意次重复,实际上,这个正则表达式可以匹配任意英文单词。
6."\"符号
"\"符号是转义符,用于屏蔽一个元字符的特殊意义,即以字面含义来解释"\"符号后面的元字符,如:
1
2
|
#转义符号屏蔽元字符"."的特殊含义 \. |
7."\<\>"符号
"\<\>"符号是精确匹配符号,该符号利用"\"符号屏蔽"<>"符号,如:
1
|
\<the\> |
该正则表达式精确匹配the 这个单词,而不匹配包含the 字符的单词,如them、there、another 等。
8."\{\}"系列符号
"\{\}"系列符号与"*"符号类似,都是表示前一个字符的重复。但是,"*"符号表示重复0 次或任意次,而"\{\}"系列符号可以指定重复次数,"\{\}"系列符号包括以下三种形式。
\{n\}:匹配前面字符出现n次。
\{n,\}:匹配前面字符至少出现n次。
\{n,m\}:匹配前面字符出现n~m次。
请看如下例子:
1
2
3
4
|
#\{\}系列符号的用法 JO\{3\}B #重复字符O 3 次
JO\{3,\}B #重复字符O 至少3次
JO\{3,6\}B #重复字符O 3~6次
|
JO\{3\}B表示重复字符O 3次,匹配值为:JOOOB。
JO\{3,\}B 表示重复字符O 至少3 次,JOOOB、JOOOOB、JOOOOOB 等字符串都可由该正则表达式来匹配。
JO\{3,6\}B表示重复字符O 至少3 次,至多6次,JOOOB、JOOOOOOB等字符串都满足,但是JOOB、JOOOOOOOB等字符串就不满足。
再举一个例子:
1
2
|
#精确匹配5个小写字母 [a-z] \{5\} |
上诉正则表达式表示精确匹配5个小写英文字母,比如hello、house等。
扩展的正则表达式
除基本的正则表达式的元字符之外,awk 和Perl 等Linux 工具还支持正则表达式扩展出来的一些元字符,如下所示
扩展的正则表达式元字符集合及其意义:
下面详细介绍扩展的正则表达式元字符及其用法。
1."?"符号
匹配"?"符号之前的那个字符0 次或1 次,如:
1
2
|
#?符号的意义 JO?B |
该表达式表示匹配O 字符0次或1 次,即匹配JB、JOB、JOOB等。需要注意的是,"?"字符至多可以匹配1 个字符。
2."+"符号
与"*"符号类似,都是匹配其前面的那个字符多次,但是,"*"符号可以匹配0次,而"+"符号至少匹配1 次,如:
1
2
|
#+符号的意义 S+EU |
该表达式表示匹配S 1 次或任意次,SEU、SSEU、SSSSEU 等字符串都可由该表达式进行匹配。
3."()"符合和"|"符号
"()"符号通常与"|"符号结合使用,表示一组可选字符的集合,如:
1
2
|
#()符号和|符号的意义 re(a|e|o)d |
该表达式中的(a|e|o)表示在字符a、e 和o 中选择任意一个字符,即read、reed、reod 都可由该表达式进行匹配。
事实上,()符号很少使用到,因为"[]"符号完全能够替代"()"符号表示一组可选字符的集合,re(a|e|o)d就等价于re[aeo]d。
"|"符号也可以表示多个正则表达式的"或"关系,基本格式为:
RE1 | RE2 | RE3 |…
上述格式中,RE1、RE2和RE3表示正则表达式。
"|"符号在扩展的正则表达式中表示"或"意义,遗憾的是,"|"符号的这种用法却很少被人记住,"|"符号最著名的是其管道符用法。
近期研读 伍之昂老师 的<<Linux Shell编程从初学到精通>>,这里当做自己的学习笔记.
元字符:元字符(Metacharacters)是用来阐释字符表达式意义的字符,简言之,元字符就是描述字符
的字符,它用于对字符表达式的内容、转换及各种操作信息进行描述。
正则表达式:正则表达式是由一串字符和元字符构成的字符串,简称RE(Regular Expression)。正
则表达式的主要功能是文本查询和字符串操作,它可以匹配文本的一个字符或字符集合。实际上,正
则表达式完成了数据过滤,将不满足正则表达式定义的数据拒绝掉,剩下与正则表达式匹配的数据。
POSIX 标准将正则表达式分为两类:基本的正则表达式和扩展的正则表达式。
基本的正则表达式
基本的正则表达式元字符集合及其意义:
下面逐个介绍正则表达式元字符的意义和用法,并举一些例子结合使用元字符集合。
1."*"符号
"*"符号用于匹配前面一个普通字符的0 次或多次重复,如:
1
|
hel*o |
"*"符号前面的普通字符是l,*字符就表示匹配l 字符0 次或多次,如字符串heo、helo、hello、hellllllo都可以由hel*o来表示。
2."."符号
点号"."用于匹配任意一个字符,如:
1
|
…73. |
由于"."符号只能匹配一个字符,因此,上述字符串表示前面三个字符为任意字符,第4 和第5 个字符是7和3,最后一个字符为任意字符,如xcb738、4J973U都能匹配上述字符串。值得注意的是,"."符号可以匹配一个空格,因此,x b738、ui 73e也能匹配上述字符串。
3."^"符号
"^"符号用于匹配行首,表示行首的字符是"^"字符后面的那个字符,如:
1
|
^cloud |
这表示匹配以cloud开头的行。结合上面介绍的"*"符号和"."符号,再举一个例子:
1
|
^…X86* |
该字符串表示行首的三个字符为任意字符(可以是空格),第4~6 个字符为X86,第7个字符开始可以重复匹配6,如:866X86666、8 6X86都可以匹配上述字符串。
4."$"符号
$符号匹配行尾,$符号放在匹配字符之后,与"^"符号的功能和用法都相反,如:
1
|
micky$ |
该正则表达式表示匹配以micky结尾的所有行。一个特殊的正则表达式是匹配所有空行的表达式,为:
1
2
|
#代表一个空行 ^$ |
该正则表达式既匹配行首,又匹配行尾,中间没有任何字符,因此,为空行。需要牢记空行表示方法,很多命令都用到这个正则表达式来表示空行。
如果需要匹配只包含一个字符的行,如下所示:
1
|
^.$ |
5."[]"符号
方括号[]匹配字符集合,该符号支持穷举方法列出字符集合的所有元素,也支持使用"-"符号表示字符集合范围,表明字符集合范围从"-"左边字符开始,到"-"右边字符结束。如果要匹配任意一个数字,可以使用如下所示的两种方法,前一种穷举了阿拉伯数字,后一种用数字范围表示,显得比较简洁。
1
2
3
4
|
#穷举方法列出字符集合 [0123456789] #使用"-"来表示集合范围 [0-9] |
"[]"也可以用做字母匹配,如下所示:
1
2
3
|
[a-z] #所有小写字母
[A-Z] #所有大写字母
[b-p] #小写字母b~p
|
Linux 系统对大小写是敏感的,并且支持字母排序,因此,Linux 中有大写字母序列和小写字母序
列,两者是分开的,a~z 表示所有的小写字母,A~Z 表示所有的大写字母,而b~p表示从b到p之间
所有的小写字母。
我们知道,"^"符号表示匹配行首,但是,"^"符号放到"[]"符号中就不再表示匹配行首了,而是表示
取反符号,请看下面例子:
1
|
[^b-d] |
"[^b-d]" 正则表达式匹配不在b~d范围之内的所有字符,此时,符号"^"不再表示匹配行首,而是取
反符号,不在b~d范围内的字符实际上涵盖了除了小写字母b、c和d之外的所有字符(包括其他字母、
数字、空格等)。再举一个"[]"符号和"*"符号结合的例子。
1
|
[A-Za-z] [A-Za-z]* |
上诉正则表达式表示以任意一个字母开头,再以任意字母进行0 次或任意次重复,实际上,这个正则表达式可以匹配任意英文单词。
6."\"符号
"\"符号是转义符,用于屏蔽一个元字符的特殊意义,即以字面含义来解释"\"符号后面的元字符,如:
1
2
|
#转义符号屏蔽元字符"."的特殊含义 \. |
7."\<\>"符号
"\<\>"符号是精确匹配符号,该符号利用"\"符号屏蔽"<>"符号,如:
1
|
\<the\> |
该正则表达式精确匹配the 这个单词,而不匹配包含the 字符的单词,如them、there、another 等。
8."\{\}"系列符号
"\{\}"系列符号与"*"符号类似,都是表示前一个字符的重复。但是,"*"符号表示重复0 次或任意次,而"\{\}"系列符号可以指定重复次数,"\{\}"系列符号包括以下三种形式。
\{n\}:匹配前面字符出现n次。
\{n,\}:匹配前面字符至少出现n次。
\{n,m\}:匹配前面字符出现n~m次。
请看如下例子:
1
2
3
4
|
#\{\}系列符号的用法 JO\{3\}B #重复字符O 3 次
JO\{3,\}B #重复字符O 至少3次
JO\{3,6\}B #重复字符O 3~6次
|
JO\{3\}B表示重复字符O 3次,匹配值为:JOOOB。
JO\{3,\}B 表示重复字符O 至少3 次,JOOOB、JOOOOB、JOOOOOB 等字符串都可由该正则表达式来匹配。
JO\{3,6\}B表示重复字符O 至少3 次,至多6次,JOOOB、JOOOOOOB等字符串都满足,但是JOOB、JOOOOOOOB等字符串就不满足。
再举一个例子:
1
2
|
#精确匹配5个小写字母 [a-z] \{5\} |
上诉正则表达式表示精确匹配5个小写英文字母,比如hello、house等。
扩展的正则表达式
除基本的正则表达式的元字符之外,awk 和Perl 等Linux 工具还支持正则表达式扩展出来的一些元字符,如下所示
扩展的正则表达式元字符集合及其意义:
下面详细介绍扩展的正则表达式元字符及其用法。
1."?"符号
匹配"?"符号之前的那个字符0 次或1 次,如:
1
2
|
#?符号的意义 JO?B |
该表达式表示匹配O 字符0次或1 次,即匹配JB、JOB、JOOB等。需要注意的是,"?"字符至多可以匹配1 个字符。
2."+"符号
与"*"符号类似,都是匹配其前面的那个字符多次,但是,"*"符号可以匹配0次,而"+"符号至少匹配1 次,如:
1
2
|
#+符号的意义 S+EU |
该表达式表示匹配S 1 次或任意次,SEU、SSEU、SSSSEU 等字符串都可由该表达式进行匹配。
3."()"符合和"|"符号
"()"符号通常与"|"符号结合使用,表示一组可选字符的集合,如:
1
2
|
#()符号和|符号的意义 re(a|e|o)d |
该表达式中的(a|e|o)表示在字符a、e 和o 中选择任意一个字符,即read、reed、reod 都可由该表达式进行匹配。
事实上,()符号很少使用到,因为"[]"符号完全能够替代"()"符号表示一组可选字符的集合,re(a|e|o)d就等价于re[aeo]d。
"|"符号也可以表示多个正则表达式的"或"关系,基本格式为:
RE1 | RE2 | RE3 |…
上述格式中,RE1、RE2和RE3表示正则表达式。
"|"符号在扩展的正则表达式中表示"或"意义,遗憾的是,"|"符号的这种用法却很少被人记住,"|"符号最著名的是其管道符用法。
本文转自marbury 51CTO博客,原文链接:http://blog.51cto.com/magic3/1353016,如需转载请自行联系原作者