用 tr 过滤文件     2005-1-7 19:52:02

Jacek Artymiak(jacek@artymiak.com)
自由作家和顾问
2003 年 7 月

    没有人曾说过 sed 很容易 — 它确实不容易!但通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能。Jacek Artymiak 向您展示如何去做。

您可以将 tr 看作为 sed 的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可以用它来除去重复字符。这就是所有 tr 所能够做的。

那么,为什么要使用 tr,而不使用 sed 呢?当然是为了使事情简单。例如,如果我们希望用字母“z”来替换出现的所有字母“a”,则可以用 tr a z,这条命令毫无疑问比 sed -e s/a/z/g 简单,尤其在把它用到脚本中时,其中的引号转义很让人头痛。另外,在使用 tr 时,可以避免写那些让人讨厌的正则表达式。

使用 tr 很简单:使用前面一段中所给出的符号表示法,用一个字符去替换出现的所有另一个字符。当需要替换多个字符时,使用类似于这样的表示法:tr abc xyz,它表示用字母“x”去替换出现的所有字母“a”,用字母“y”去替换所有字母“b”,用字母“z”去替换所有字母“c”。这两组中所列出的字符的数目不必相等。

您也可以指定字符的范围。例如,tr a-z A-Z 将用对应的大写字母来替换所有的小写字母(例如,它将“no smoking”转换成“NO SMOKING”)。当您在 vi 编辑器中想强调正在编辑的文本的某一部分时,使用这一特殊技巧非常方便。只要按一下 Escape 键,然后按 : 键,再输入 2,4!tr 'a-z' 'A-Z',最后按一下 Return 键。现在,从第 2 行到第 4 行的字母就都转换成了大写字母。
关于 tr 的其它内容
GNU 手册上提到,tr 在执行您所选择的操作时,通过将标准输入复制到标准输出,从而实现“转换、压缩和/或删除字符”。在这篇技巧文章中,您将了解到这些选项;当然也可以通过了解 tr 的手册页或信息页,学习到更多关于 tr 的内容。

打开一个新的终端窗口,输入 man tr 或 info tr — 或者打开一个新的浏览器窗口,并链接到 gnu.org 上的 tr 手册页(关于这个链接,请参阅参考资料)。

另外,当有人给您发送了一个在 Mac OS 或 DOS/Windows 机器上创建的文本文件时,您会发现 tr 非常有用。如果没有将文件保存为使用 UNIX 换行符来表示行结束这种格式,则需要将这样的文件转换成本机 UNIX 格式,否则一些命令实用程序不会正确地处理这些文件。Mac OS 的行尾以回车字符结束,许多文本处理工具将这样的文件作为一行来处理。为了纠正这个问题,可以用下列技巧:

    * Mac -> UNIX:tr '\r' '\n' < macfile > unixfile
    * UNIX -> Mac:tr '\n' '\r' < unixfile > macfile

Microsoft DOS/Windows 约定,文本的每行以回车字符并后跟换行符结束。为了纠正这个问题,可以使用下列命令:

    * DOS -> UNIX:tr -d '\r' < dosfile > unixfile
    * UNIX -> DOS:在这种情况下,需要用 awk,因为 tr 不能插入两个字符来替换一个字符。要使用的 awk 命令为 awk '{ print $0"\r" }' < unixfile > dosfile

另外,当您需要对文本文件做一些简单的整理工作(如用 tr -d '\t' 除去制表符,用 tr -s ' ' 除去多余的空格,或者用 tr -d '\n' 将分开的几行合成一行)时,会需要用 tr。同样,可以在 vi 内使用所有这些命令;只要记住:在 tr 命令前要加上您希望处理的行范围和感叹号(!),如 1,$!tr -d '\t'(美元符号表示最后一行)中所示。

有什么问题,或是有什么见解吗?我很欢迎您的来信 — 请将邮件发至 jacek@artymiak.com。

下次,我们将讨论 uniq。到那时见!

参考资料

    * 请阅读本系列的其它技巧文章:
          o 了解 textutils
          o 用 cat 合并文件
          o 使用 head 和 tail 以块方式读取文本流
          o 用 sort 和 tsort 对文件进行排序

    * tr 手册页位于 gnu.org 上。在 GNU 文本实用程序手册中可以找到关于这些有用工具的更多信息(在 MIT 上还有同一 TOC 的更详细手册,在那里您也可以找到一大堆甚至更有用的 GNU 工具)。

    * Windows 用户可以在 Cygwin 包中找到这些工具。

    * Mac OS X 用户也许想尝试 Fink,它将丰富的 UNIX 环境安装在新的 Mac OS X 下。

    * 对您来说,存在一些问题?尝试查看有关 GNU 文本实用程序的常见问题及解答。

    * 在深入研究这里我们所涉及的工具之前,需要更多有关这些工具的介绍性信息吗?请尝试从 UNIXhelp for users 入手。

    * 当然,在这方面,最经典的作品是由 O'Reilly and Associates 出版的 Unix Power Tools(Jerry Peek、Tim O'Reilly 和 Mike Loukides,1997 年;ISBN 1-56592-260-3)。

    * 着迷于 UNIX 文本实用程序(同样也着迷于 UNIX)吗?那么您会喜欢由 Thomas Scoville 撰写的“UNIX as Literature”这本经典著作。

    * 如果您需要一种工具做这些基本工具没有涉及到的事情 — 即搜索 Web 的命令行界面 — 简单地浏览那些列出这样工具的站点。在 Google 上用关键词 linux text utilities 进行搜索,会汇集许多这方面的信息 — 例如,来自 Linux.org 的这些信息。当然,象 Freshmeat 或 SourceForge 这样的搜索引擎也会列出大量这些定制工具。

    * 您也许想查看 IBM 的 Tools and Toys for UNIX 页面。

    * 如果您仍未找到想要的工具,则学着用 developerWorks 系列文章“Unix 实用程序”第 1 部分到第 4 部分来自己编写 UNIX 实用程序。该系列文章包括“Yet another new component architecture”、“Simple tools, complex problems”、“The easiest component you'll ever write”以及最后一篇“Unix's lessons for component architectures”。

    * 在掌握了如何自己编写实用程序之后,了解如何将它们转到库中!使用 developerWorks 教程“Building a cross-platform C library”来做这件事,非常容易。

    * 在这篇 developerWorks 教程“vi 入门 -- 巧表单方法”中学习使用 vi 编辑器。

    * 在 developerWorks Linux 专区查找 Linux 参考资料。

关于作者
Jacek Artymiak 是一位自由顾问、开发人员和作家。自从 1991 年以来,他就一直为各种商业的和免费的 UNIX 和 BSD 操作系统(AIX、HP-UX、IRIX、Solaris、Linux、FreeBSD、NetBSD、OpenBSD 和其它操作系统)以及 MS-DOS、Microsoft Windows、Mac OS 和 Mac OS X 开发软件。Jacek 擅长于商业和金融方面应用程序的开发、Web 设计、网络安全、计算机图形学、动画和多媒体。他是一位多产的作家,写一些有关技术方面的文章,Jacek 与他人合著了“Install, Configure, and Customize Slackware Linux”(Prima Tech,2000 年)和“StarOffice for Linux Bible”(IDG Books,2000 年)。在 SourceForge 可以找到 Jacek 所开发的许多软件项目。可以在他的个人网站上更多地去了解他,可以通过 jacek@artymiak.com 与他联系。
责任编辑:

作者:【Jacek Artymiak】   

关闭窗口