11.3 延伸正则表达式

事实上,一般读者只要了解基础型的正则表达式大概就已经相当足够了,不过,某些时刻为了要简化整个指令操作, 了解一下使用范围更广的延伸型正则表达式的表示式会更方便呢!举个简单的例子好了,在上节的例题三的最后一个例子中,我们要去除空白行与行首为 # 的行列,使用的是

grep -v '^$' regular_express.txt | grep -v '^#'

需要使用到管线命令来搜寻两次!那么如果使用延伸型的正则表达式,我们可以简化为:

egrep -v '^$|^#' regular_express.txt

延伸型正则表达式可以通过群组功能“ | ”来进行一次搜寻!那个在单引号内的管线意义为“或 or”啦! 是否变的更简单呢?此外,grep 默认仅支持基础正则表达式,如果要使用延伸型正则表达式,你可以使用 grep -E , 不过更建议直接使用 egrep !直接区分指令比较好记忆!其实 egrep 与 grep -E 是类似命令别名的关系啦!

熟悉了正则表达式之后,到这个延伸型的正则表达式,你应该也会想到,不就是多几个重要的特殊符号吗? ^^y 是的~所以,我们就直接来说明一下,延伸型正则表达式有哪几个特殊符号?由于下面的范例还是有使用到 regular_express.txt ,不巧的是刚刚我们可能将该文件修改过了 @@,所以,请重新下载该文件来练习喔!

RE 字符 意义与范例
+ 意义:重复“一个或一个以上”的前一个 RE 字符 范例:搜寻 (god) (good) (goood)… 等等的字串。 那个 o+ 代表“一个以上的 o ”所以,下面的执行成果会将第 1, 9, 13 行列出来。 > egrep -n 'go+d' regular_express.txt
? 意义:“零个或一个”的前一个 RE 字符 范例:搜寻 (gd) (god) 这两个字串。 那个 o? 代表“空的或 1 个 o ”所以,上面的执行成果会将第 13, 14 行列出来。 有没有发现到,这两个案例( 'go+d' 与 'go?d' )的结果集合与 'go*d' 相同? 想想看,这是为什么喔! ^_^ > egrep -n 'go?d' regular_express.txt
意义:用或( or )的方式找出数个字串 范例:搜寻 gd 或 good 这两个字串,注意,是“或”! 所以,第 1,9,14 这三行都可以被打印出来喔!那如果还想要找出 dog 呢? > egrep -n 'gd|good' regular_express.txt > egrep -n 'gd|good|dog' regular_express.txt
() 意义:找出“群组”字串 范例:搜寻 (glad) 或 (good) 这两个字串,因为 g 与 d 是重复的,所以, 我就可以将 la 与 oo 列于 ( ) 当中,并以 来分隔开来,就可以啦! > egrep -n 'g(la|oo)d' regular_express.txt
()+ 意义:多个重复群组的判别 范例:将“AxyzxyzxyzxyzC”用 echo 叫出,然后再使用如下的方法搜寻一下! > echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'

上面的例子意思是说,我要找开头是 A 结尾是 C ,中间有一个以上的 "xyz" 字串的意思~

以上这些就是延伸型的正则表达式的特殊字符。另外,要特别强调的是,那个 ! 在正则表达式当中并不是特殊字符, 所以,如果你想要查出来文件中含有 ! 与 > 的字行时,可以这样:

  1. > grep -n '[!>]' regular_express.txt

这样可以了解了吗?常常看到有陷阱的题目写:“反向选择这样对否? '[!a-z]'?”, 呵呵!是错的呦~要 'a-z 才是对的!至于更多关于正则表达式的进阶文章,请参考文末的参考数据[2]

原文: https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/99.html