Shell脚本学习笔记——基本正则与扩展正则

我们在前面测试grep工具时,其中有一个 -E 选项,那如果将这个 -E 去掉,会出现什么现象呢?

echo "abcabcabcabcdef" | grep --color '(abc){3}'

我们发现,去掉之后再进行匹配,就会出现不一样的结果,为了解释这个现象,我们这里要引入两个概念:

  • 基本正则表达式
  • 扩展正则表达式

这两者的区别是:正则表达式的扩展规范和基本规范基本相同。只是在基本规范下,有些字符(?  +  {}  |  () )应解释为普通字符,要表达上述特殊含义,则需要加 \ 转义。反之,在扩展规范下,?  +  {}  |  () 应被理解成特殊含义,要取其字面值,也要对其进行 \ 转义。

所以,grep工具带上 -E 选项,表示使用扩展正则来进行匹配,如没有,则表示使用基准正则进行匹配。

上面的问题解决:

echo "abcabcabcabcdef" | grep --color '\(abc\)\{3\}'

如果目标字符串当中本身就包含了 ?  +  {}  |  () 字符,想匹配这些字符,又该如何编写呢?

echo "aa{}()|?+bb" | grep --color '{}()|?+'

echo "aa{}()|?+bb" | grep --color -E '{}()|?+'

echo "aa{}()|?+bb" | grep --color -E '\{\}\(\)\|\?\+'

这样,\ 的作用也就明了了。

echo "aa{}()|?+bb" | grep --color -E 'aa'

echo "aa{}()|?+bb" | grep --color -E 'bb'

echo "aa{}()|?+bb" | grep --color -E 'aa|bb'

| 用来级联多个条件,只要有任意一个匹配,即可匹配,表示或者的关系,我们称之为析取符。


至此,正则表达式的基础就介绍完了,利用这些内容,我们再去学习其他内容,就会容易得多了。




你可能感兴趣的:(Shell脚本)