Linux正則表達式-反复出现的字符

星号(*)元字符表示它前面的正則表達式能够出现零次或多次。也就是说,假设它改动了单个字符。那么该字符能够在那里也能够不在那里,而且假设它在那里,那可能会不止出现一个。能够使用星号元字符匹配出如今引號中的单词。


□"*hypertext"*□

无论单词"hypertext"是否出如今引號中都会被匹配。

并且,假设由星号修饰的字符确实存在。那么有可能出现多次。

比如,我们来看一系列数字:
1
5
10
50
100
500
1000
5000

正則表達式[15]0*将匹配全部的行,并且则表达式[15]00*匹配除前两行以外的全部的行。

第一个0是字面值,可是第二个由星号修饰,意味着它可能出现也可能不出现。

经常使用类似的方法匹配一个或多个(而不是0个或多个)空格,能够使用以下的表达式来完毕:
□□*
当星号元字符前面有句点元字符时,匹配随意数目的字符。

这可用于标识两个固定的字符串之间的字符的跨度。假设想要匹配引號中的随意字符串,能够指定:
".*"
它匹配该行上的第一个引號和最后一个引號之间的全部字符以及引號。使用".*"进行匹配的范围总是最大的。

眼下它似乎并不重要,可是一旦学习替换被匹配的字符串时这就非常重要了。

作为还有一个样例,一对尖括号标记语言中用来包围格式化指令的普通符号,标记语言如HTML。通过指定以下的表达式能够打印带有标记的全部的行:

$ grep ' <.*>' sample

当星号用于修饰字符类时,则能够匹配类中的随意数目的字符。

比如以下5行的演示样例文件:
I can do it
I cannot do it
I can not do it
I can' t do it
I cant do it
假设我们想要匹配以上语句中的否定语句,但不匹配肯定语句,能够使用以下的正則表達式:
can[ no' ]*t
星号使得类中的随意字符以随意顺序匹配,而且匹配随意多次的出现。例如以下所看到的:

$ grep "can[ no' ]*t" sample
I cannot do it
I can not do it
I can' t do it
I cant do it

有4个成功和1个失败(肯定语句)。注意假设正則表達式试图匹配字符串"can"和"t"之间的随意个字符,例如以下例所看到的:
can.*t
它将匹配全部的行。

技术术语"closure (闭合)"有匹配"零次或多次"的能力。egrep和awk使用的元字符扩展集提供了几个很实用的closure 的变化。加号(+)匹配前面的正則表達式的一次或多次出现。前面匹配一个或多个空格的演示样例能够简化为:
□+
元字符加号能够被觉得是"至少一个"的前导字符。其实,它和很多人使用的"*"号相相应。

问号(?)匹配零次或一次出现。比如,在前面的演示样例中,我们使用正則表達式匹配"80286" 、"80386" 和" 80486" 。

假设我们还想匹配字符串"8086" ,能够用egrep 或awk编写正則表達式:
80[234]?

86

它匹配"80"后面跟有一个2 ,一个3 ,一个4,或者没有字符,然后跟字符串"86"。不要混淆表达式中的?和shell中的?

通配符。Shell 中的?表示单个字符。等效于正則表達式中的"."


參考资料:http://www.linuxawk.com/communication/436.html

posted @ 2016-03-02 11:54  zfyouxi  阅读(284)  评论(0编辑  收藏  举报