学习使用 Sed 文本编辑器
sed命令是为 AT&T 原始 Unix 操作系统的第 7 版创建的,此后可能已包含在每个 Unix 和 Linux 操作系统中。sed应用程序是一个_流编辑器_,与文本编辑器不同,它不会打开一个可视缓冲区来加载文件数据以进行处理。相反,它根据键入到终端的命令或脚本中的一系列命令逐行对文件进行操作。 安装 更多 Linux 资源 Linux 命令备忘单 高级 Linux 命令备忘单 免费在线课程:
sed
命令是为 AT&T 原始 Unix 操作系统的第 7 版创建的,此后可能已包含在每个 Unix 和 Linux 操作系统中。sed
应用程序是一个_流编辑器_,与文本编辑器不同,它不会打开一个可视缓冲区来加载文件数据以进行处理。相反,它根据键入到终端的命令或脚本中的一系列命令逐行对文件进行操作。
安装
更多 Linux 资源
-
Linux 命令备忘单
-
高级 Linux 命令备忘单
-
免费在线课程:RHEL 技术概述
-
Linux 网络备忘单
-
SELinux 备忘单
-
Linux 常用命令备忘单
-
什么是 Linux 容器?
-
我们最新的 Linux 文章
如果您使用的是 Linux、BSD 或 macOS,那么您已经安装了 GNU 或 BSDsed
。这是原始sed
命令的两个独特重新实现,虽然它们相似,但可能存在细微差别。 GNUsed
通常被认为是功能最丰富的sed
,并且在任何这些平台上都可以广泛使用。
如果您找不到 GNUsed
(在非 Linux 系统上通常称为gsed
),那么您可以从 GNU 网站](http://www.gnu.org/software/sed/)下载[的源代码。安装 GNUsed
的好处是它可以用于它的额外功能,但如果您需要便携性,它也可以被限制为仅符合sed
的POSIX规范。
在 Windows 上,您可以使用Chocolatey安装GNUsed
。
Sed 的工作原理
sed
应用程序一次运行一行。因为它没有视觉显示,所以它创建了一个模式空间——内存中的一个空间,包含来自输入流的当前行(删除了任何尾随的换行符)。一旦填充了模式空间,就会执行您对sed
的指令。有时您的命令是有条件的,而有时它们是绝对的,因此这些命令的结果取决于您如何使用sed
。
当到达命令末尾时,sed
将模式空间的内容打印到输出流。默认输出流是 stdout,但可以使用--in-place=.bak
选项将其重定向到文件甚至返回到同一文件。
然后循环再次从下一个输入行开始。
sed
命令的语法是:
$ sed --options [optional SCRIPT] [INPUT FILE or STREAM]
查找要编辑的内容
在可视化编辑器中,您通常无需考虑太多就可以在文本文件中找到要更改的内容。您的眼睛(或屏幕阅读器)会扫描文本,找到您要更改的字词或要插入或删除文本的位置,然后您就可以开始输入了。但是sed
没有交互模式,所以你必须告诉它必须满足什么条件才能运行特定的命令。
对于这些示例,假设名为example.txt
的文件包含以下文本:
你好
世界
这是第三行。
这是最后一行。
行号
指定行号告诉sed
只对文件中的特定行进行操作。
例如,此命令选择文件的第 1 行并打印它。因为sed
处理后的默认动作也是打印一行到stdout,这样就有复制第一行的效果:
$ sed ‘1p’ example.txt
你好
你好
世界
这是第三行。
这是最后一行。
您也可以分步指定行号。例如,1~2
表示每 2 行被选中(“从第一行开始每隔 2 行选择一次”)。指令1~3
表示在第一行之后每隔三行选择一次:
$ sed ‘1p’ example.txt
你好
你好
世界
这是第三行。
这是最后一行。
这是最后一行。
线位置
通过使用$
作为选择器,您只能对文件的最后一行进行操作:
$ sed ‘$p’ example.txt
你好
世界
这是第三行。
这是最后一行。
这是最后一行。
在 GNUsed
中,您可以选择多行(例如,sed '1,$p'
打印第一行和最后一行)。
否定
任何按数字或位置的选择,都可以用感叹号 (!
) 字符反转。这将选择所有行 except 第一行:
$ sed ‘1!p’ example.txt
你好
世界
世界
这是第三行。
这是第三行。
这是最后一行。
这是最后一行。
模式匹配
您可以将模式匹配视为文字处理器或浏览器中的查找操作。您提供一个词(pattern),然后选择结果。模式匹配的语法是/pattern/
。
$ sed ‘/hello/p’ example.txt
你好
你好
世界
这是第三行。
这是最后一行。
$ sed ‘/line/p’ example.txt
你好
世界
这是第三行。
这是第三行。
这是最后一行。
这是最后一行。
用 Sed 编辑
找到要编辑的内容后,您可以执行所需的任何操作。您可以通过命令使用sed
执行编辑。sed
中的命令与sed
命令本身不同。如果有帮助,请将它们视为“动作”或“动词”或“指令”。
sed
中的命令是单个字母,例如前面示例中使用的 print 命令的p
。一开始可能很难回忆起来,但就像所有事情一样,你可以通过练习来了解它们。
p 用于打印
p
指令打印模式空间中当前保存的任何内容。
d 用于删除
d
指令删除模式空间。
$ sed ‘$d’ example.txt
你好
世界
这是第三行。
$ sed ‘1d’ example.txt
世界
这是第三行。
这是最后一行。
s 用于搜索和替换
s
命令搜索模式并将其替换为其他内容。这可能是sed
最流行和最随意的用法,它通常是用户学习的第一个(有时也是唯一一个)sed
命令。它几乎可以肯定是文本编辑最有用的命令。
$ sed ‘s/world/opensource.com/’
你好
开源网站
这是第三行。
这是最后一行。
您也可以在替换文本中使用一些特殊功能。例如,\L
将替换文本转换为小写,而\l
仅对下一个字符执行相同操作。还有其他的,列在sed
文档中(您可以使用info sed
命令查看)。
替换子句中的特殊字符&
指的是匹配的模式:
$ sed ‘s/is/\U&/’ example.txt
你好
世界
这是第三行。
这是最后一行。
您还可以传递特殊标志来影响s
如何处理它找到的内容。g
(可能是 global)标志告诉s
将替换应用于该行中找到的所有匹配项,而不仅仅是第一个匹配项:
$ sed ‘s/is/\U&/g’ example.txt
你好
世界
这是第三行。
这是最后一行。
其他重要的标志包括一个数字来指示匹配模式的哪个出现会影响:
$ sed ‘s/is/\U&/2’ example.txt
你好
世界
这是第三行。
这是最后一行。
后跟文件名的w
标志将匹配的行写入文件_仅当_发生更改时:
$ sed ‘s/is/\U&/w sed.log’ example.txt
你好
世界
这是第三行。
这是最后一行。
$ 猫 sed.log
这是第三行。
这是最后一行。
可以组合标志:
$ sed ‘s/is/\U&/2w sed.log’ example.txt
你好
世界
这是第三行。
这是最后一行。
$ 猫 sed.log
这是第三行。
脚本
有很多很棒的网站都有sed
“单行”。它们为您提供面向任务的sed
命令来解决常见问题。但是,为自己学习sed
可以让您编写自己的单行代码,并且可以根据您的特定需求进行定制。
sed
的脚本可以在终端中写成行,或者它们可以保存到文件中并由sed
本身执行。我倾向于将小脚本全部编写为一个命令,因为我发现自己在现实生活中很少重复使用sed
命令。当我编写一个sed
script 时,它通常非常特定于一个文件。例如,在写完这篇文章的初稿后,我使用sed
来标准化“sed”的大小写,这可能是我再也不需要做的任务了。
您可以向sed
发出一系列不同的命令,用分号 (;
) 分隔。
$ sed '3t ; s/line/\U&/' example.txt
你好
世界
这是第三行。
这是最后一行。
使用大括号更改范围
您还可以限制使用大括号 ({}
) 影响的结果。当您将sed
命令括在大括号中时,它们仅适用于特定选择。例如,单词“line”出现在示例文本的两行中。您可以强制sed
仅影响最后一行,方法是声明所需的匹配条件($
表示最后一行),然后将您想要执行的s
命令放在大括号中:
$ sed ‘$ {s/line/\U&/}’ example.txt
你好
世界
这是第三行。
这是最后的LINE。
学习 Sed
您可以使用sed
做比本文中解释的更多的事情。我什至还没有涉及到分支 (b
)、测试 (t
)、hold 空间 (H
) 和许多其他功能。就像ed
一样,sed
可能不是您要用于创建文档甚至是您需要执行的每个脚本任务的文本编辑器,但它是您作为 POSIX 用户拥有的强大选项。了解sed
命令的结构以及如何编写短脚本可以快速更改大量文本。通读 GNUsed
的info
页面,或 BSDsed
的手册页,了解sed
能为您做什么。
更多推荐
所有评论(0)