你是否一直在寻找另一种对文本进行编辑操作的方法?不用再找了!这个教程为你提供了一些流编辑器 sed 的示例。
简而言之,sed 允许你以非交互方式对文件和文本流进行广泛的编辑。你在调用命令时做出编辑决策。在这个教程中,你将学习如何使用 sed 命令,有效地优化你的工作流程。
继续阅读,提升你的命令行技能吧!
先决条件
确保你有以下内容,以便跟着本教程进行实际演示:
- A command line interface (e.g., Terminal on macOS or Linux) – This tutorial uses Ubuntu Linux 20.04, but the commands should work on most popular operating systems.
- A text editor (e.g., nano, vi, or Sublime Text) – This tutorial uses Nano.
在 Ubuntu 上安装 sed
sed 通常作为大多数类 Unix 操作系统(包括 Linux 和 macOS)的标准实用程序包含在内。但无论如何,在执行文本转换之前,双重检查你的系统上是否已经安装了 sed 是可以的,也是一个基本步骤。
1. 打开你的终端,并运行以下 sed
命令来检查你系统上安装的 sed 版本。
如果 sed 已安装,你将看到 sed 版本号以及一些有关构建的信息,如下所示。

否则,如果未安装sed,您将看到以下错误消息。
此错误消息表示在您系统的PATH环境变量中未找到sed
命令。

2. 接下来,运行以下命令来更新并安装系统上的sed
:
此命令从配置的软件包源获取最新的软件包信息,包括软件包的依赖关系、文件和脚本。运行此命令是确保安装sed的最新版本和可能需要的任何其他软件包的必要步骤。

3. 最后,运行以下命令来验证系统上是否安装了sed
:
此命令打印sed可执行文件的完整路径,在此示例中为/usr/bin/sed。
安装sed并验证它在您的PATH中后,您可以使用sed
命令执行各种文本转换和操作。

在文本文件中替换字符串
sed是大多数类Unix操作系统上可用的流编辑器,其最有用的功能之一是在文本文件中替换字符串。
以下是一些场景,但不限于,在这些情况下替换字符串是有帮助的:
- 更新URL列表以反映新的域名。
- 在数据库或CSV文件中更改产品ID。
- 为导入到另一个系统的数据进行格式化等等。
使用sed的基本语法如下,其中:
Placeholder | Function |
---|---|
command | Controls sed’s behavior. |
options | Allows you to customize the behavior of the sed command |
input_file | Specifies the file or text stream that you want to edit. Typically, you can specify a single file or stream, but concatenating multiple files or streams by redirection also works. |
output_file | Specifies the file that contains the results of your sed command. The file can be new or the same as input_file, depending on how you use sed. |
假设你有一个名为urls.txt
的文本文件,其中包含一系列URL,你想要更新所有URL以使用新的域名。
1. 运行以下echo
命令在当前目录创建urls.txt
文件。
2. 接下来,运行cat
命令查看urls.txt文件的内容。cat urls.txt
下面的输出确认了urls.txt文件中写入的三个旧URL。

3. 现在,运行以下命令在urls.txt
文件中查找并替换(s
)所有字符串old-domain.com
为new-domain.com
。
你将看到输入文件中的URL已经使用新域名更新,如下所示。

替换字符串的第N次出现
除了基本的搜索和替换功能外,sed还有其他内置命令,允许你执行更复杂的文本转换。一个例子是在单行文本中替换模式字符串的第n次出现。
例如,你希望使用新值更新CSV文件中的第二字段,或者更新数据库转储中字符串的第三次出现。
该命令的基本语法如下:
模式
– 要替换的字符串。替换
– 要用作替换的字符串。n
– is the nth occurrence of the string to replace (e.g.,1
=first occurrence,2
=second occurrence…).
要查看如何替换字符串的第n次出现,请按照以下步骤操作:
运行以下echo
命令以创建一个包含三次模式quick
的文本行。然后,sed
命令将替换(s
)模式quick
的第二次出现(2
)为字符串fast
。
如下所示,只有模式quick的第二次出现已被字符串fast替换,而其他所有出现都保持不变。
默认情况下,nth
命令区分大小写。因此,该命令仅寻找模式的确切匹配。要忽略模式的大小写,请跳转到以下步骤。

?请注意,
nth
命令从左到右计算模式的出现次数。此外,nth
命令仅适用于单行文本。要对多行执行替换,请使用下一节中演示的不同方法。
接下来,运行以下命令以忽略大写情况下替换quick
模式的第二次(2
)出现为fast
。
在处理大小写不一致的文本时,i
选项非常方便。
以下是输出结果,在这个结果中,第二次出现的单词quick(QuiCk)成功地被字符串fast替换——无论大小写。

替换所有匹配模式/字符串的出现次数
与其替换字符串的第n个出现次数不同,也许您计划替换所有出现次数。 这样做可以帮助您大规模更新每个版权字符串的当前年份,例如。
1. 在您喜欢的文本编辑器中创建名为input.txt的文件,并将以下内容写入其中。
This is a quick test.
The quick brown fox jumps over the lazy dog.
Quick, you need to finish this task before it gets too late.
2. 接下来,运行以下命令从input.txt
文件中替换(s
)所有单词quick
的出现次数为fast
。 替换完成后,更改将写入output.txt
文件中。
3. 现在,运行以下命令查看output.txt
文件的内容,并验证替换是否已完成。
您将看到所有单词quick的出现都已被替换为fast,如下所示。 与nth
命令类似,g
命令区分大小写,并且仅替换精确匹配项。
如下所示,Quick字符串不会被替换,但您可以使用i
选项执行不区分大小写的替换。

在特定行上替换匹配模式字符串
也许你已经知道想要替换的字符串在哪一行。如果你可以在特定行替换字符串,为什么要替换所有出现的地方呢?当对文件或流的特定行进行更改而保留其他行不变时,这个功能就很有用。
以下是替换特定行字符串的语法,其中n
代表行号。
1. 创建一个名为myfile.txt的文件,并填入以下内容。
test1
test2
test3
2. 接下来,运行以下sed
命令执行以下操作:
- 从
myfile.txt
文件的第二行(2
)开始搜索单词test2
。用test2_changed
替换(s
)。将更改写入一个名为myfile_changed.txt
的新文件。
This command does not provide output to the terminal since the changes are written to a new file. But you will verify the changes in the following step.
3. 最后,运行以下cat命令查看myfile_changed.txt
文件的内容。
如下所示,myfile.txt文件的第二行已被替换为test2_changed,而其他所有行保持不变。

仅输出已更改的字符串行
在进行更改后,您可能不想打印文件的全部内容,而只想打印已更改的行。如何做呢?通过使用p
标志和-n
选项。
以下是仅打印已更改的字符串行的语法:
-n
选项告诉sed
不要默认打印每一行。-
标志告诉
sed
命令打印输出。
打开你的 myfile.txt 文件并将内容替换为以下内容。注意,第二行不正确,因为单词 first
应该改为 second
。
This is the first line of my file.
This is the first line of my file.
This is the third line of my file.
现在,运行以下 sed
命令来将第二行(2
)中的字符串 first
替换为 second
,但只输出修改后的行(p
)。
你将在终端上看到修改后的第二行的输出,如下所示。

结论
在本教程中,您已经使用了不同的 sed 使用示例来执行搜索和替换操作。此外,您还涉及了更高级的技术,如替换特定出现并仅输出修改后的行。
sed 是一个强大的命令行工具,可让您执行各种文本操作任务。无论是在整个文件上进行全局替换还是在特定行上进行有针对性的替换,sed 都能胜任。
现在,为什么不去了解更多关于 正则表达式 的知识呢?正则表达式对许多文本操作工具都至关重要,包括 sed。这些表达式可以节省时间,减少工作量。何时使用?当您在大量文本上执行复杂的搜索和替换操作时。