sed
命令是为 AT&T 最初的 Unix 操作系统第 7 版创建的,此后,可能每一个 Unix 和 Linux 操作系统都包含了它。sed
应用程序是一个 流编辑器,与文本编辑器不同的是,它不会打开一个视觉缓冲区,将文件的数据加载到其中进行处理。相反,它根据在终端输入的命令或脚本中的一系列命令,逐行对文件进行操作。
安装
如果你使用的是 Linux、BSD 或 macOS,那么你已经安装了 GNU 或 BSD 版的 sed
。这是两个不同的原始 sed
命令的重新实现,虽然它们很相似,但也有一些小的区别。GNU sed
通常被认为是功能最丰富的 sed
,而且它在这些平台上都可以广泛使用。
如果你找不到 GNU sed
(在非 Linux 系统上通常被称为 gsed
),那么你可以。安装 GNU sed
的好处是,可以使用它的额外功能,但它也可以被限制为只符合 sed
的规范,如果你需要移植性的话。
在 Windows 上,你可以用GNU sed
。
Sed 如何工作
sed
应用程序一次只处理一行。因为它没有视觉显示,所以它在内存中创建了一个模式空间:一个包含输入流的当前行的空间(去掉任何尾部的换行符)。一旦填充了模式空间,你对 sed
的指令就会被执行。有时你的指令是有条件的,有时是无条件的,所以这些指令的结果取决于你如何使用 sed
。
当命令结束时,sed
会将模式空间的内容打印到输出流中。默认的输出流是标准输出,但可以将其重定向到一个文件,甚至使用 --in-place=.bak
选项重定向到同一个文件中。
然后再从下一个输入行开始循环。
sed
命令的语法是:
-
$ sed --options [optional SCRIPT] [INPUT FILE or STREAM]
找到你要编辑的内容
在可视化编辑器中,你通常不需要考虑太多,就能在文本文件中找到你想要修改的内容。你的眼睛(或屏幕阅读器)会扫描文本,找到你想改变的单词或你想插入或删除文本的地方,然后你就可以开始输入了。而 sed
没有交互模式,所以你需要告诉它必须满足什么条件才能运行特定的命令。
在这些例子中,假设一个名为 example.txt
的文件包含了这样的文字:
-
hello
-
world
-
This is line three.
-
Here is the final line.
行号
指定行号告诉 sed
只对文件中的那一行进行操作。
例如,下面这条命令选择文件的第 1 行并打印出来。因为 sed
在处理后的默认操作也是打印一行到标准输出,这样做的效果就是重复第一行:
-
$ sed '1p' example.txt
-
hello
-
hello
-
world
-
This is line three.
-
Here is the final line.
你也可以步进式指定行号。例如,1~2
表示每两行选择一行(“从第一行开始每两行选择一行”)。指令 1~3
表示从第一行开始,每三行选择一行:
-
$ sed '1p' example.txt
-
hello
-
hello
-
world
-
This is line three.
-
Here is the final line.
-
Here is the final line.