对了,还有最后一个内容,通过使用字符对其进行转义,您可以在模式中使用这些特殊字符的字面内容(即作为其本身) 。
将其组合在一起
既然已经向您介绍了一些非常简单的正则表达式,那么让我们来尝试一些有用的内容 。给定 ls -l(文件长 清单)的输出,您将从中提取权限信息、大小和名称 。清单 14 显示了要进行处理的 ls -l 输出示例 。
清单 14. ls -l 的典型输出
chrish@dhcp3 [365]$ ls -l | tail
drwx------3 chrishwheel102 Jun 14 21:38 gsrvdir501
drwxr-xr-x2 chrishwheel68 Jun 16 16:01 hsperfdata_chrish
drwxr-xr-x3 root wheel102 Jun 14 23:38 hsperfdata_root
-rw-r--r--1 root wheel531 Jun 14 10:17
Illustrator_activation.plist
-rw-r--r--1 root wheel531 Jun 14 10:10 indesign_activation.plist
-rw-------1 nobodywheel24 Jun 16 16:01 objc_sharing_ppc_4294967294
-rw-------1 chrishwheel132 Jun 16 23:50 objc_sharing_ppc_501
-rw-------1 security wheel24 Jun 16 10:04 objc_sharing_ppc_92
-rw-r--r--1 root wheel531 Jun 14 10:05 Photoshop_activation.plist
-rw-r--r--1 root wheel928 Jun 14 10:17 serialinfo.plist
正如您所看到的,这里一共有 7 列:
权限 链接的数目 属主 组 大小 最后的修改时间 名称让我们来建立一些正则表达式,以匹配其中的每一列:
.([r-][w-][x-]){3}—权限(使用 . 匹配第一个字符,因为它可能是几个不同的特殊字符中的任何一个 。) [[:digit:]] —链接的数目 [A-Za-z0-9_-.]-—属主(您还可以使用这个模式进行组匹配 。) [[:digit:]] —大小 .{3} [0-9 ]{2} [0-9 ][0-9]:[0-9][0-9]—修改时间(您可以对这个模式进行一些简化,因为所有的文件都在 6 月份进行的修改,所以您可以确切地指定月份的名称 。) . $—名称(在这些内容之后,您需要匹配所有的字符,直到行尾 。)在上述模式之间,必须使用 [[:space:]]对它们进行连接,因为您并不知道这些列之间究竟是使用空格或制表符,还是两者的组合进行分隔 。您还需要将权限、大小和名称放到组中,以便可以在替换中使用它们 。如清单 15 所示,正则表达式很快就变得难以理解 。
清单 15. 完成后的正则表达式实在难以理解!
(.([r-][w-][x-]){3})[[:space:]] [[:digit:]] [[:space:]] ([A-Za-z0-9_-.]
[[:space:]] ){2}([[:digit:]] )[[:space:]] .{3} [0-9 ]{2} [0-9
][0-9]:[0-9][0-9][[:space:]] (. )$
如果您仔细研究这个可怕的正则表达式模式,您将发现 5 个组:
完整的权限块 权限块中最后匹配的 rwx 组 组(该模式的属主/组部分中最后匹配的内容) 大小 名称在清单 16 中,您将更改 ls -l 的输出以显示文件名、权限和大小 。
清单 16. 对输出进行重组
chrish@dhcp3 [382]$ ls -l | tail | sed -E
's/(.([r-][w-][x-]){3})[[:space:]] [[:digit:]] [[:space:]] ([A-Za-z0-9_-.
] [[:space:]] ){2}([[:digit:]] )[[:space:]] .{3} [0-9 ]{2} [0-9
][0-9]:[0-9][0-9][[:space:]] (. )$/5 (1) has 4 bytes of data/'
gsrvdir501 (drwx------) has 102 bytes of data
hsperfdata_chrish (drwxr-xr-x) has 68 bytes of data
hsperfdata_root (drwxr-xr-x) has 102 bytes of data
Illustrator_activation.plist (-rw-r--r--) has 531 bytes of data
indesign_activation.plist (-rw-r--r--) has 531 bytes of data
objc_sharing_ppc_4294967294 (-rw-------) has 24 bytes of data
objc_sharing_ppc_501 (-rw-------) has 132 bytes of data
objc_sharing_ppc_92 (-rw-------) has 24 bytes of data
Photoshop_activation.plist (-rw-r--r--) has 531 bytes of data
serialinfo.plist (-rw-r--r--) has 928 bytes of data
成功了!您已经完成了对输出结果的转换 。
使用 Perl 完成相应的工作
Perl 编程和脚本语言(请参见参考资料部分)的功能非常强大,通常可用来取代前面介绍的 tr 和 sed 命令 。通常可以在命令行中直接输入简短的 Perl 程序,有时它可以完成比 tr 或 sed 命令行更多的操作 。
推荐阅读
- 一 V226选购、使用记
- 如何移动UNIX目录
- SCO UNIX基础讲座--第五讲:电子邮件
- MP3使用5天感觉
- SCO UNIX基础讲座--第六讲:後援复制
- 在sco 5.0.5中定时运行程序
- 使用半年小评桑达5300优缺点
- 使用ppt制作出小人跑步动画效果具体操作方法
- 在SCO下直接使用ISO镜像安装软件的方法
- SCO UNIX 5 的引导过程
