清单 12. 实际应用中的多个匹配项
chrish@dhcp3 [356]$ echo "hellooooo" | sed -E 's/o?$/_/g'
helloooo_
chrish@dhcp3 [357]$ echo "hellooooo" | sed -E 's/o*$/_/g'
hell_
chrish@dhcp3 [358]$ echo "hellooooo" | sed -E 's/o+$/_/g'
hell_
如果使用圆括号将模式元素括起来,您可以在替换字符串中使用匹配的内容。这些元素称为组,它们使得正则表达式搜索和替换操作的功能变得非常强大,但是却很难理解。例如,在清单 13 中,您匹配一个或多个 l (el) 字符,并且后面跟着零个或多个 o 字符。依次使用第二组和第一组中的内容对其进行替换,实际上是对它们进行交换。请注意这个模式中各个组的引用方法,即反斜杠加上该组的序号。
清单 13. 匹配组
chrish@dhcp3 [361]$ echo "hellooooo" | sed -E 's/(l+)(o*)$/21/g'
heoooooll
通过在大括号中指定匹配的数目,您可以匹配特定数目的模式。例如,模式 o{2} 将匹配两个(仅仅两个)o 字符。
对了,还有最后一个内容,通过使用 字符对其进行转义,您可以在模式中使用这些特殊字符的字面内容(即作为其本身)。
将其组合在一起
既然已经向您介绍了一些非常简单的正则表达式,那么让我们来尝试一些有用的内容。给定 ls -l(文件长 清单)的输出,您将从中提取权限信息、大小和名称。清单 14 显示了要进行处理的 ls -l 输出示例。
清单 14. ls -l 的典型输出
chrish@dhcp3 [365]$ ls -l | tail
drwx------ 3 chrish wheel 102 Jun 14 21:38 gsrvdir501
drwxr-xr-x 2 chrish wheel 68 Jun 16 16:01 hsperfdata_chrish
drwxr-xr-x 3 root wheel 102 Jun 14 23:38 hsperfdata_root
-rw-r--r-- 1 root wheel 531 Jun 14 10:17
Illustrator_activation.plist
-rw-r--r-- 1 root wheel 531 Jun 14 10:10 indesign_activation.plist
-rw------- 1 nobody wheel 24 Jun 16 16:01 objc_sharing_ppc_4294967294
-rw------- 1 chrish wheel 132 Jun 16 23:50 objc_sharing_ppc_501
-rw------- 1 security wheel 24 Jun 16 10:04 objc_sharing_ppc_92
-rw-r--r-- 1 root wheel 531 Jun 14 10:05 Photoshop_activation.plist
-rw-r--r-- 1 root wheel 928 Jun 14 10:17 serialinfo.plist
标签: