Bash Shell grep正则表达式

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”。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!