3.8. 使用 Sed —— 第二部分

未匹配的标注

使用 Sed —— 第二部分

脚本文件

在命令行输入更长的编辑脚本是不切实际的。这就是为什么最好创建一个包含编辑指令的脚本文件。编辑脚本仅仅是按出现顺序执行的 sed 命令列表。

使用 -f 选项的这种形式,要求你在命令行上指定脚本名称。

sed -f scriptfile file

所有我们想执行的编辑命令都放在一个文件里,我们约定创建的临时脚本文件名为 sedscr

$ cat sedscr
s/ MA/, Massachusetts/
s/ PA/, Pennsylvania/
s/ CA/, California/
s/ VA/, Virginia/
s/ OK/, Oklahoma/

下面的命令读取 sedscr 中的所有替代命令,然后将它们应用于输入文件 list 的每一行:

➜  ch02 git:(daily) ✗ sed -f sedscr list
John Daggett, 341 King Road, Plymouth, Massachusetts
Alice Ford, 22 East Broadway, Richmond, Virginia
Orville Thomas, 11345 Oak Bridge Road, Tulsa, Oklahoma
Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania
Eric Adams, 20 Post Road, Sudbury, Massachusetts
Hubert Sims, 328A Brook Road, Roanoke, Virginia
Amy Wilde, 334 Bayshore Pkwy, Mountain View, California
Sal Carpenter, 73 6th Street, Boston, Massachusetts

结果仍是临时的显示在屏幕上,输入文件没有丝毫改变。

如果一个 sed 脚本能被反复使用,你就应该从命名这个脚本并保存它。可以在个人或系统库中维护已证明价值的脚本。

保存输出

除非你将 sed 的输出重定向到另一个程序,否则你将想在文件捕获输出。这可以通过指定一个 shell 的 I/O 重定向符号加上一个文件名来完成:

➜  ch02 git:(daily) ✗ sed -f sedscr list > newlist
➜  ch02 git:(daily) ✗ cat newlist
John Daggett, 341 King Road, Plymouth, Massachusetts
Alice Ford, 22 East Broadway, Richmond, Virginia
Orville Thomas, 11345 Oak Bridge Road, Tulsa, Oklahoma
Terry Kalkas, 402 Lans Road, Beaver Falls, Pennsylvania
Eric Adams, 20 Post Road, Sudbury, Massachusetts
Hubert Sims, 328A Brook Road, Roanoke, Virginia
Amy Wilde, 334 Bayshore Pkwy, Mountain View, California
Sal Carpenter, 73 6th Street, Boston, Massachusetts

不要把输出重定向到你正在编辑的文件,否则你将损坏他。(“>” 这个重定向符号在 shell 做任何事之前就截断文件。)如果你想用输出文档替换输入文档,你可以使用 mv 命令 作为一个独立的步骤来完成。但首先确保你的编辑脚本已经正常运作。

在第四章 《编写 sed 脚本》,我们将学习一个名为 runsed 的 shell 脚本,它自动化了创建一个临时文件,然后使用 mv 去覆盖原始文件的过程。

抑制输入行的自动显示

Sed 的默认操作是输出每一个输入行。-n 选项抑制了自动输出。当指定这个选项时,每一个想要产生输出的指令都必须包含一个打印命令 p。 看下面的例子。

➜  ch02 git:(daily) ✗ sed -n -e 's/MA/Massachusetts/p' list
John Daggett, 341 King Road, Plymouth Massachusetts
Eric Adams, 20 Post Road, Sudbury Massachusetts
Sal Carpenter, 73 6th Street, Boston Massachusetts

将这个输出和本节的第一个例子比较,在这里只有被这个命令影响的那些行被打印出来。

混合选项(POSIX)。

你可以在命令行上通过混合 -e-f 选项来创建一个脚本。此脚本是所有命令按给定顺序的组合。这个特性似乎在 sed 的 Unix版本中得到支持,但并没有被明确地在 manpage 里面提及。 POSIX 标准明确要求了这个行为。

选项小结

表 2-1 sed 命令行选项

选项 描述
-e 后面是编辑指令。
-f 后面是脚本名称。
-n 抑制输入行的自动输出。

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

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~