1、正则表达式的注意事项(至少在macbook环境下是这样)
Linux命令中,正则表达式可以直接给出打,也可以使用单引号或者双引素号包着,比如下搭面的三条命令都有一样的seven效果。
grep a. project_log
grep 'a.' project_log
grep "a." project_log
他们都是在project_log文件中搜索a和任意字符组成的字符串
。
但是在强烈建议使用单引号或者双引号包着正则大表达式。因为只有在这种情酥况下,正则表达式达中的转义字符\
才有效。
比如grep a\. project_log
和grep a. project_log
效果一样,转移字符直接被忽略了。
而grep 'a\.' project_log
则是只搜索a.
。
2、正则表达式
2.1、替换类
替换类seven是指像任意一个字符,任意n个字符,一个数字,一个字母之类的,只与字符有关的表达式。
字符 | 说明 | 示例 |
---|---|---|
* | 匹配0个或多个* 前的一个字符 | 比如a*b ,那可以匹配到ab ,aaaaab ,eeeb ,efoaab 等。 |
. | 匹配一个且只有一个任意字符,该字符可以是空格 | 比如a. ,可以答匹配到ab ,ac ,a(接一个空格) 等,但是不能匹配到在行尾的a 。 |
[abc] | [] 中是字符集(不是字符串集),匹配一个字符集中的任意一个字符。 | 比如[abc] ,可以匹配dfoja kjieb kc 。 |
[^abc] | 与[abc] 类似,其中的^ 是取反,表示匹配除字符集以外的其它字符。 | 比如[^abc] ,可以匹配dfoj akjie bk c。 |
a\{n,m\} | {n,m} 表示重复前一个字符n到m次,两边都是闭区间。总的来说,该表达式匹配重复n到m次a的字符串 。要注意到,Linux命令中{ 和} 属于普通字符,要想让他们被当成运算符需要加上转义字符。 | 比如a\{3,5\} 会匹配eoaaaa dkoen,aaaaa oekfoa。 |
a\{n,\} | 这个表示匹配至少重复n次a的字符串 ,与a\{n,m\} 一样需要加上转义符。 | 比如a\{3,\} 匹配aakewaaa 。 |
a\{n\} | 匹配由n个a组成的字符串 ,与a\{n,m\} 一样需要加上转义符。 | 比如a\{3\} 匹配aakaaa ooeaaa aa。 |
+ | 拓展类正则,对于这类正则grep等命令需要加上-E 后这些运算符才大能生苏效打。匹配一个或多个前一个字符,这个字符可以是其它正则运算符。 | 比如a+ 匹配efa onaaa 。而.+ 匹配所有内容,除了空行。 |
? | 拓展类正则。匹配0个或多个前一个字符,这个字符可以是正则运算符。 | ro?t 匹配rt oerot krooot 。 |
| | 拓展类正则。或符号。连接两个正则表达式,符合两个中任意一个正则的内容都会匹配成功 | ac|bc 匹配aac oekbabc 。 |
() | 和数学中的括号一样 | (ac|bc)n 匹配acacn bcbcn 。 |
[0-9] | 表示任意一个数字,范围看缩小 | [0-9]koe 匹配1koe···, 0koe和 9koe```等。 |
[a-Z] | 匹配任意一个字母,大写小写都匹配,这个范围可继续缩小 | [a-Y] 匹配除大写Z以外的所有字母。 |
2.1.1、字符类的匹配原则
像这类匹配字符的有一个原则,任意两个匹配内容不会重复。
比如用a\{2\}
来查找这行文本eoaaaeo
。执行以下代码。
grep 'a\{2\}' project_log --color=always
查找结果如下
我们可以看到,系统只匹配了三个a中的前面两个a。不会存在匹配到前面两个a之后,又去匹配由中间的a和第三个a组成的字符串。任意两个字符串之间是不会有交集的。
2.2、位置类
位置类是指以···开头,以···结尾的之类的,与位置有关的表达式
字符 | 说明 | 示例 |
---|---|---|
^ | 匹配以^ 后接的字符串为开头的行。^后可以接其它正则。 | 比如^a ,可以匹配到以a为开头的行。^ab 可以匹配到以ab 为开头的行。^a*b.c 则是匹配以0个或多个a开头,后接一个b,一个任意字符,一个c 的字符串为开头的行。 |
$ | 匹配$ 前接的字符串为结尾的行,这个字符串可以是正则。 | 比如a$ 可以匹配到所有以a为结尾的行。ab$ 可以匹配到以ab 为结尾的行。a*b.c$ 则是匹配以0个或多个a开头,后接一个b,一个任意字符,一个c 的字符串为结尾的行。 |
2.2.1、^ 和 $ 同时使用
这里我觉得有个示例说明会好一些。假设project_log文件中有下面一行内容。
eodkolkfowjploldfqp
执行下列命令,查找以eod开头,接0个或多个字符,以j为结尾
的字符串为开头的行
grep '^eod.*j' project_log --color=always
查找结果如下
执行一列命令,查找以lo开头,任意0个或多个字符,最后以字符p结尾
的字符串结尾的行
grep 'lo.*p' project_log --color=always
查找结果如下
如果^
和$
同时使用的话,比如^ac*b$
,这个表示查找以a开头,0个或多个c,b结尾
的字符串为开头,同时也大是苏打结尾的行。
3、常用的正则
-------- | ----- | ----
匹配所有字符(包括空行) | .*
匹配所有字符(不包括空行) | .+
匹配空行 | ^$