5.6. 测试和保存输出
5.6 测试和保存输出
在前面对模式空间的讨论中,你看到了 sed:
-
对输入行做一个拷贝。
-
在模式空间中修改那个拷贝。
-
将拷贝输出到标准输出。
这意味着 sed 有一个内置的防护机制,以至于你不能对原文件进行修改。因此,下面的命令行:
$ sed -f sedscr testfile
不会在 testfile 中进行修改。它将所有行(被修改的行和不变的行)一起输出到标准输出(通常是屏幕)。如果你想保存它,你必须用一个新文件来捕捉这个输出。
$ sed -f sedscr testfile > newfile
重定向符 ">" 将输出从 sed 引导到文件 newfile。不要从命令行将输出重定向回输入文件,否则你将覆盖这个输入文件。这甚至将在 sed 有机会处理文件之前发生,实际上会损坏你的数据。把输出重定向到一个文件的重要原因是检验你的结果,你可以检验 newfile 的内容,然后将它和 testfile 进行比较。如果你想非常系统化的检查你的结果(并且你应该这么做),使用 diff 程序来查看这两个文件之间的不同。
$ diff testfile newfile
这个命令将这样显示这些行:只在 testfile 中出现的行前置 "<"。只在 newfile 中出现的行前置 ">"。当你已经查验证完你的结果,对原来的输入文件做一个备份拷贝后就使用 mv 命令来用新版本的文件覆盖原来的文件。在丢弃原始版本之前,必须要确认编辑脚本正常工作。
因为这些步骤是如此频繁地重复,你会发现将它们放到一个 shell 脚本中是有用的。然而我们不会深入研究效脚本的工作原理,要理解并使用这些脚本是相当容易的。写一个 shell 脚本,包括使用一个文本编辑器键入一个或多个 命令行在一个文件中,保存这个文件,然后使用 chmod 命令使得这个文件可被执行。文件名就是这个命令的名称,然后就能够在系统提示符那里键入。如果你不熟悉需要脚本,就请把书中出现的 shell 脚本作为模仿的例子。在里面你可以进行自己的替换。
下面这两个 shell 脚本,对于测试 sed 脚本和在一个文件中进行永久性的变化是有用的。当同样的脚本需要被运行到多个文件上时,它们特别有用。
推荐文章: