学习使用 Sed 文本编辑器

Sed 缺少常用的文本框,而是通过用户命令直接在文件上写入。
59 位读者喜欢这个。
Command line prompt

Opensource.com

sed 命令是为 AT&T 最初的 Unix 操作系统版本 7 创建的,并且可能包含在之后的所有 Unix 和 Linux 操作系统中。sed 应用程序是一个流编辑器,与文本编辑器不同,它不会打开一个可视缓冲区,将文件的数据加载到其中进行处理。 相反,它根据终端中键入的命令或脚本中的一系列命令,逐行地对文件进行操作。

安装

如果您使用的是 Linux、BSD 或 macOS,那么您已经安装了 GNU 或 BSD sed。 这些是原始 sed 命令的两个独特的重新实现,虽然它们很相似,但可能存在细微差异。 GNU sed 通常被认为是功能最丰富的 sed,并且在任何这些平台上都广泛可用。

如果您找不到 GNU sed(在非 Linux 系统上通常称为 gsed),那么您可以从 GNU 网站下载其源代码。 安装 GNU sed 的好处在于,它可以用于其额外的功能,但如果您需要可移植性,它也可以被约束为仅符合 sedPOSIX 规范。

在 Windows 上,您可以使用 Chocolatey 安装 GNU sed

Sed 的工作原理

sed 应用程序一次处理一行。 因为它没有可视化显示,所以它创建一个模式空间——内存中的一个空间,其中包含来自输入流的当前行(删除了任何尾随换行符)。 模式空间填充后,您对 sed 的指令将被执行。 有时您的命令是有条件的,有时它们是绝对的,因此这些命令的结果取决于您使用 sed 的方式。

当命令结束时,sed 将模式空间的内容打印到输出流。 默认输出流是 stdout,但可以使用 --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 在处理后的默认操作也是将行打印到 stdout,所以这具有复制第一行的效果

$ sed ‘1p’ example.txt
hello
hello
world
This is line three.
Here is the final line.

您也可以按步长指定行号。 例如,1~2 表示选择每 2 行(“从第一行开始选择每隔一行”)。 指令 1~3 表示选择第一行之后的每隔三行

$ sed ‘1p’ example.txt
hello
hello
world
This is line three.
Here is the final line.
Here is the final line.

行位置

您可以使用 $ 作为选择器,仅对文件的最后一行进行操作

$ sed ‘$p’ example.txt
hello
world
This is line three.
Here is the final line.
Here is the final line.

在 GNU sed 中,您可以选择多行(例如,sed '1,$p' 打印第一行和最后一行)。

否定

对于任何按数字或位置的选择,您都可以使用感叹号 (!) 字符来反转。 这会选择除第一行之外的所有行

$ sed ‘1!p’ example.txt
hello
world
world
This is line three.
This is line three.
Here is the final line.
Here is the final line.

模式匹配

您可以将模式匹配视为文字处理器或浏览器中的 查找 操作。 您提供一个单词(一个模式),然后选择结果。 模式匹配的语法是 /pattern/

$ sed ‘/hello/p’ example.txt
hello
hello
world
This is line three.
Here is the final line.
$ sed ‘/line/p’ example.txt
hello
world
This is line three.
This is line three.
Here is the final line.
Here is the final line.

使用 Sed 进行编辑

找到要编辑的内容后,您可以执行所需的任何操作。 您可以使用 sed 命令使用 sed 执行编辑。 sed 中的命令与 sed 命令本身不同。 如果有帮助,可以将它们视为“操作”或“动词”或“指令”。

sed 中的命令是单个字母,例如前面示例中使用的 print 命令的 p。 一开始可能难以记住它们,但与所有事情一样,通过练习您就会了解它们。

p 用于打印

p 指令打印当前模式空间中包含的任何内容。

d 用于删除

d 指令删除模式空间。

$ sed ‘$d’ example.txt
hello
world
This is line three.
$ sed ‘1d’ example.txt
world
This is line three.
Here is the final line.

s 用于搜索和替换

s 命令搜索模式并将其替换为其他内容。 这可能是 sed 最流行和最常见的用途,并且通常是用户学习的第一个(有时也是唯一一个)sed 命令。 这几乎可以肯定是文本编辑最有用的命令。

$ sed ‘s/world/opensource.com/’
hello
opensource.com
This is line three.
Here is the final line.

您也可以在替换文本中使用特殊函数。 例如,\L 将替换文本转换为小写,而 \l 仅对下一个字符执行相同的操作。 还有其他的,这些都列在 sed 文档中(您可以使用 info sed 命令查看该文档)。

替换子句中的特殊字符 & 指的是匹配的模式

$ sed ‘s/is/\U&/’ example.txt
hello
world
ThIS is line three.
Here IS the final line.

您还可以传递特殊标志来影响 s 处理找到的内容的方式。 g(可能代表 global)标志告诉 s 将替换应用于该行上找到的所有匹配项,而不仅仅是第一个匹配项

$ sed ‘s/is/\U&/g’ example.txt
hello
world
ThIS IS line three.
Here IS the final line.

其他重要的标志包括一个数字,用于指示要影响的匹配模式的哪个出现

$ sed ‘s/is/\U&/2’ example.txt
hello
world
This IS line three.
Here is the final line.

w 标志后跟文件名,仅当进行了更改时,才会将匹配的行写入文件

$ sed ‘s/is/\U&/w sed.log’ example.txt
hello
world
ThIS is line three.
Here IS the final line.
$ cat sed.log
ThIS is line three.
Here IS the final line.

标志可以组合

$ sed ‘s/is/\U&/2w sed.log’ example.txt
hello
world
This IS line three.
Here is the final line.
$ cat sed.log
This IS line three.

脚本

有很多很棒的网站都提供 sed "单行命令"。 它们为您提供面向任务的 sed 命令来解决常见问题。 但是,自己学习 sed 使您能够编写自己的单行命令,并且可以根据您的特定需求进行定制。

sed 的脚本可以写成终端中的行,也可以保存到文件中并使用 sed 本身执行。 我倾向于将小型脚本全部写成一个命令,因为我发现自己在现实生活中很少重复使用 sed 命令。 当我编写 sed 脚本时,它通常非常特定于一个文件。 例如,在编写本文的初稿之后,我使用 sed 来标准化 "sed" 的大小写,而我可能再也不需要执行这项任务了。

您可以使用分号 (;) 分隔,向 sed 发出一系列不同的命令。

$ sed ‘3t ; s/line/\U&/’ example.txt
hello
world
This is LINE three.
This is the final line.

使用大括号更改范围

您还可以使用大括号 ({}) 限制受影响的结果。 当您将 sed 命令括在大括号中时,它们仅适用于特定选择。 例如,单词 “line” 出现在示例文本的两行中。 您可以强制 sed 仅影响最后一行,方法是声明所需的匹配条件($ 表示最后一行)并将您要执行的 s 命令立即放在大括号中

$ sed ‘$ {s/line/\U&/}’ example.txt
hello
world
This is line three.
This is the final LINE.

学习 Sed

您可以使用 sed 做很多比本文解释的更多的事情。 我什至还没有涉及到分支 (b)、测试 (t)、保留空间 (H) 和许多其他功能。 像 ed 一样,sed 可能不是您要用于文档创建甚至您需要完成的每个脚本任务的文本编辑器,但它是您作为 POSIX 用户的强大选择。 学习如何构造 sed 命令以及如何编写短脚本可以对大量文本进行快速更改。 阅读 GNU sedinfo 页面,或 BSD sed 的 man 页面,并了解 sed 可以为您做什么。

接下来要阅读的内容

我为什么喜欢 Emacs

Emacs 不仅仅是一个文本编辑器; 它可以让您掌控一切,并允许您解决遇到的几乎所有问题。

Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。 他曾在电影和计算机行业工作,而且经常同时工作。

1 条评论

感谢您提醒我这件事。 当我第一次开始作为芯片设计师进行愤怒编程时,我曾经使用流编辑器来帮助自动化大量工作,这些工作需要对大型数据目录层次结构执行大量操作。我一直想重新审视这类事情!

© . All rights reserved.