正确的 sed 【程序编程相关:redhat linux8.1beta2】
【推荐阅读:清除CISCO路由器密码】在本系列中,将使用 gnu sed 3.02.80.在即将出现的本系列后续文章中,某些(但非常少)最高级的示例将不能在 gnu sed 3.02 或 3.02a 中使用.如果您使用的不是 gnu sed,那么结果可能会不同.现在为什么不花些时间安装 gnu sed 3.02.80 呢?那样,不仅可以为本系列的余下部分作好准备,而且还可以使用可能是目前最好的 sed. 【扩展信息:让Debian不长一点赘肉】sed 示例
sed 通过对输入数据执行任意数量用户指定的编辑操作(“命令”)来工作.sed 是基于行的,因此按顺序对每一行执行命令.然后,sed 将其结果写入标准输出 (stdout),它不修改任何输入文件.让我们看一些示例.头几个会有些奇怪,因为我要用它们演示 sed 如何工作,而不是执行任何有用的任务.然而,如果您是 sed 新手,那么理解它们是十分重要的.下面是第一个示例:
$ sed -e d /etc/services如果输入该命令,将得不到任何输出.那么,发生了什么?在该例中,用一个编辑命令 d 调用 sed.sed 打开 /etc/services 文件,将一行读入其模式缓冲区,执行编辑命令(“删除行”),然后打印模式缓冲区(缓冲区已为空).然后,它对后面的每一行重复这些步骤.这不会产生输出,因为 "d" 命令除去了模式缓冲区中的每一行!
在该例中,还有几件事要注意.首先,根本没有修改 /etc/services.这还是因为 sed 只读取在命令行指定的文件,将其用作输入 -- 它不试图修改该文件.第二件要注意的事是 sed 是面向行的.d 命令不是简单地告诉 sed 一下子删除所有输入数据.相反,sed 逐行将 /etc/services 的每一行读入其称为模式缓冲区的内部缓冲区.一旦将一行读入模式缓冲区,它就执行 d 命令,然后打印模式缓冲区的内容(在本例中没有内容).我将在后面为您演示如何使用地址范围来控制将命令应用到哪些行 -- 但是,如果不使用地址,命令将应用到 所有行.
第三件要注意的事是括起 d 命令的单引号的用法.养成使用单引号来括起 sed 命令的习惯是个好注意,这样可以禁用 shell 扩展.
另一个 sed 示例
下面是使用 sed 从输出流除去 /etc/services 文件第一行的示例: $ sed -e 1d /etc/services | more如您所见,除了前面有 1 之外,该命令与第一个 d 命令十分类似.如果您猜到 1 指的是第一行,那您就猜对了.与第一个示例中只使用 d 不同的是,这一次使用的 d 前面有一个可选的数字地址.... 下一页