UNIX® 起源于简单的文本处理,并且在他的命令行环境中保留了功能最强大的文本处理工具之一。通过将一系列简单的命令组合在一起,能够完成复杂的文本转换,UNIX 提供的工具允许您构建几乎任何所需的文本处理引擎。
引言
在 UNIX® 诞生之初,人们不大熟悉这种新的操作系统,但他们很快找到了适当的切入点,大学中的研究人员需要一种像样的文本处理环境。因为在那个时候,电脑的处理速度和内存容量有限,所以程式必须很小,并且相对比较简单。这样就产生了 UNIX 中著名的设计思想:“一组工具协同工作,以便完成一项任务”。通过 UNIX 管道将几种很小的、但功能强大的文本处理工具组合在一起,能够对文本进行各种方式的转换和操作。
在本文中,您将简要了解从文档和程式中获得文本、使用 tr 命令对其进行简单的转换、使用 sed 命令进行复杂的搜索和替换操作。然后,您将使用 Perl 编程和脚本语言再次完成这些操作,这样一来您就能够认识到,Perl 的功能很强大,他能够替代 tr 和 sed 命令。
开始之前
假如您希望按照本文中的示例进行实验,请确保您能够使用 UNIX 命令行环境。这可能是本地电脑中的终端模拟程式(在现代桌面中通常称为 终端,假如您习惯使用 Windows®,那么能够使用 Cygwin)、或通过 SSH 访问的远程系统。
本文的示例所使用的 Shell 语法适用于 GNU Bash,有关需要使用的特定语法,请参考您的 Shell 手册(或能够考虑使用 Bash)。
对文本进行各种操作
在开始使用 UNIX 的各种文本实用程式操作文本之前,需要了解如何获得文本。并且在进行这项工作之前,需要了解 UNIX 的标准输入/输出 (I/O) 流。
标准 C 库(因而,每个 UNIX 程式)定义了三种标准流:输入、输出和错误。有时将他们称为 stdin、stdout 和 stderr,这是在任何 C 程式中用来表示他们的全局变量。
当您在 Shell 中使用 > 操作符将程式输出重定向到文档时,就能够将他的标准输出 (stdout) 流发送到这个文档。例如:ls > this-dir 将 ls 的输出发送到一个名为 this-dir 的文档。
当您在 Shell 中使用 < 操作符将程式输入重定向到文档时,就能够将该文档中的内容输入到该程式的标准输入 (stdin) 流。例如:sort < this-dir 能够从名为 this-dir 的文档中读取内容,并将其作为 sort 命令的输入。
另一个常用于重定向标准流的操作符是“|”(管道)操作符,他能够将左侧程式的标准输出流连接到右侧程式的标准输入流。例如:ls | sort 和前面的两个示例完成相同的任务,并且无需临时文档,ls 的输出直接进入 sort 命令。
假如您仔细观察,那么可能会发现,前面的这些示例中并没有出现标准错误 (stderr) 流。和标准输出流相同,能够对 stderr 进行重定向或使用管道进行传输,但是您需要告诉 Shell 您希望处理 stderr 而不是 stdout。
能够使用 2> 操作符将标准错误流重定向到文档。在处理生成有用的错误输出的命令时,您经常会看到这个操作符,比如用于编译 UNIX 程式的 make 工具:make 2> build-errors。
这个命令运行了 make,并将任何错误信息发送到 build-errors 文档。和之类似,您能够使用 2| 将 stderr 通过管道传递到另一个程式。
假如您对具体的细节感兴趣,那么其他的流也有和之对应的数字,尽管很少使用到他们(0 表示标准输入,1 表示标准输出),除了在一个很常见的操作符中。在清单 1 所示的示例中,2>&1 操作符将标准错误流连接 到标准输出流。和 > 操作符组合在一起,您能够使 stderr 和 stdout 输出到相同的文档中。
清单 1. 将标准错误流连接到标准输出流
make > build-output 2>&1
|
命令
有两个常用来生成文本输出的标准 UNIX 命令:cat 和 echo。
cat 命令读取参数中指定的每个文档,并将这些文档的内容写入到 stdout。echo 命令将其参数写入到 stdout。您常常会发现他们作为更复杂的命令管道中的一部分(请参见清单 2)。
清单 2. 使用 cat 和 echo
cat file1 file2 ... filen
echo arguments...
|
但假如您只需要文档中开头的部分或结尾的部分,那又应该如何呢?
cat 有两种可用来完成这种任务的变种,称为 head 和 tail(请参见清单 3),他们分别能够显示开头的或结尾的 10 行内容,您能够使用
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




