电脑技术学习

使用 UNIX 进行文本处理

dn001

  清单 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

标签: