2.3. 一个流编辑器

未匹配的标注

一个流编辑器

Sed 是一个 “非交互式” 的面向流的编辑器。它面向流是因为——像许多 UNIX 程序——输入流过程序,然后被引导到标准输出。(比如 vi 就不是面向流的,大部分 DOS 应用程序也不是)输入通常来自于一个文件,但是也能从键盘输入——当然这样做并不是特别有用。输出默认是到终端屏幕,但也能被捕捉到一个文件中。 Sed 是通过解释一个指定需要执行动作的脚本来完成工作的。

Sed 提供了一个能力,看起来就像交互式文本编辑的自然扩展。比如,它提供了一个搜索替换功能,能全局的应用于单个文件或一组文件。虽然你通常不会使用 sed 去改变在一个特殊文件里面只出现一次的一个术语。但你将发现在许多文件里做一系列的更改时,使用 sed 会非常有用。想象一下,在几分钟内对超过 100 个文件进行 20 个不同更改,你就会对sed 能够多强大有一个概念。

使用 sed 和写简单的 shell 脚本(或 DOS 的批处理文件)是类似的。指定一系列按顺序执行的动作。大部分动作能够在 vi 里面手动完成:替换文本、删除行、插入新行等等。 Sed 的优点是你能在一个地方指定所有编辑指令,然后一次性的将他们通过文件来执行他们。你不需要到每一个文件去进行每一次更改。 Sed 还能够有效地编辑非常大的,交互式编辑会很慢的文件。

在创建和维护一个文档的过程当中,有许多机会使用 Sed,特别是当文档包含独立的章节,而这些章节每一个都放到一个独立的文件中时。通常在文档的草稿经过审核后,会有许多应用于所有文件的更改。比如在一个软件文档项目的过程当中,软件或者它组件的名称可能会更改。然后你就需要跟踪并做出这些修改。有了 sed 这就是一个很简单的过程。

Sed 能用来在整个文档中达到统一性,你可以搜索一个特殊术语可能用到的所有不同方式,然后让它们变成一样的。你可以使用 sed 在文档被 troff 格式化前插入特殊的排版代码或符号,比如它可以用来把普通的引号替换为 ASCII 字符代码中的前后双引号[^1](也就是“卷曲的”引号,而不是"直直的"引号)。

Sed 还能用来作为一个编辑过滤器。换句话说,你可以处理一个输入文件,然后将输出发送到另一个程序。比如你可以使用 sed 来分析一个普通的文本文件,然后插入 troff 宏,再将输出导入到 troff 已进行格式化。它允许你在内存中——可能是临时的——进行编辑。

作者或出版商能使用 sed 写出许多转换程序——比如将在 ScribeTEX 文件中的格式化代码翻译到 troff 中或者转换电脑文字处理文件,比如 WordStar。随后我们将学习一个 sed 脚本,它将 troff 宏转换为样式表标签,以便能在 Ventura Publisher 中使用。( 或许 Sed 可以将程序的语法从一个语言转换到另一个语言)。当 Sun Microsystems 第一次创造出 XWiew 时,他们发行了一个转换程序,用来将 SunView 程序转换到 XView 中。这个程序很大程度上由 sed 脚本组成——转换众多函数的名称。

Sed 有少量的基本程序结构,能用来建造更复杂的脚本。它也有一点受限的能力来一次性对多行进行操作。

除了最简单的脚本,所有的 sed 脚本通常都是从一个 “shell” 包裹器——一个shell 脚本,调用 Sed 并且包含 Sed 执行的命令——中进行调用。shell 包裹器是命名和执行一个单字命令的简单方式。这个命令的用户不需要知道 sed 正在被使用。一个例子就是 phrase 脚本,我们在书的后面将会学习,它允许你匹配一个可能覆盖到两行的模式,解决 grep 的一个特定限制。

总结,sed 可以:

  1. 自动化在一个或多个文件上进行的编辑动作。
  2. 简化在多个文件上进行同样编辑的任务。
  3. 写转换程序。

脚注

脚注1

据我所知,在mac上添加卷曲引号目前有两种方法:

  1. 切换到搜狗中文输入法,按住 shift,再按一下 , ,即可输入 ;紧接着再按一下 ,,即可输入
  2. 在英文输入法下,按住 option,再按 {,即可输入 ;按住 shift 和 option,再按 {,即可输入

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~