grep
中的正则表达式提供了更为强大的模式匹配功能,能够满足大部分需求。
正则表达式描述了待匹配字符串的模式。字母字符(或者对于 shell 没有特殊含义的其他字符)只匹配自身。“A”匹配 A,“B”匹配 B,这没什么好说的。另一个重要的规则是按位置组合字母,如 AB匹配“AB”。这看起来也是显而易见的。但是,正则表达式还定义了其他一些特殊字符,它们既可以单独使用,也可以与其他字符结合,从而形成更为复杂的模式。
第一个特殊字符是点号(.
),它可以匹配任意单个字符。因此,…. 可以匹配任意 4 个字符;A.
匹配“A”以及紧随其后的任意单个字符;.A.
匹配任意单个字符,然后是“A”,接着是任意单个字符(未必和匹配到的第一个字符相同)。
星号(*
)匹配上一个字符的 0 次或多次出现,因此,A*
匹配 0 个或多个“A”字符,.*
匹配 0 个或多个任意字符(如“abcdefg”、“aaaabc”、“sdfgf ;lkjhj”,甚至是空行)。
那么 ..*
是什么意思?它匹配任意单个字符以及紧随其后的 0 个或多个任意字符(也就是一个或多个字符,但不能是空行)。
说到文本行,脱字符 ^
匹配文本行的行首位置,而美元符号 $
匹配文本行的行尾位置,因此 ^$
匹配空行(行首紧接行尾,两者之间什么都没有)。
如果想要匹配字面上的点号、脱字符、美元符号或者其他特殊字符,该怎么办呢?在特殊字符前加上反斜线(\
)即可。ion.
匹配字母“ion”以及紧随其后的任意单个字符,但是 ion\.
则匹配“ion”以及点号(例如,在句末或者其他以尾部点号出现的地方)。
方括号中的一组字符(如 [abc]
)匹配其中任意某个字符(如“a”、“b”或“c”)。如果方括号内的第一个字符是脱字符,则匹配的是不在该字符组中的任意字符。
举例来说,[AaEeIiOoUu]
匹配任意的元音字母,[^AaEeIiOoUu]
则匹配元音字母以外的任意字符。后一种情况不同于匹配辅音字母,因为 [^AaEeIiOoUu]
也能匹配标点符号和其他既非元音也非辅音的特殊字符。
另一个要介绍的是被称为“区间表达式”的重复机制,写作 \{n,m\}
,其中,n 是重复的最小次数,m 是重复的最大次数。如果写作 \{n\}
,则表示“只重复 n 次”;写作 \{n,\}
,则表示“至少重复 n 次”。
例如,正则表达式 A\{5\}
匹配连续 5 个“A”,而 A\{5,\}
至少匹配连续 5 个“A”。
酷客网相关文章:
评论前必须登录!
注册