Linux 上 sed 流编辑器指南

linuxoperating systemopen source更新于 2026/1/22 22:22:17

简介

Sed,也称为"流编辑器",是一款功能强大的 Linux 命令行工具,允许您对输入流(文件或管道输入)执行基本的文本转换。Sed 尤其适用于批量修改大量文件,或编辑难以用文本编辑器打开的文件。本指南将详细介绍 sed,包括其语法、基本命令以及如何在不同场景中使用 sed 的示例。我们还将探索分组和就地编辑等高级功能,帮助您熟练使用这款多功能工具。

语法

sed 命令的基本语法如下:-

$ sed 'command' file

命令两端的单引号重要,因为它们能让 sed 正确解释命令。file 是 sed 将要操作的输入文件。sed 也可以接受来自管道的输入,在这种情况下,file 参数不是必需的。

命令

替换

sed 最常见的用途之一是执行替换。"s"命令表示代理命令。基本语法如下:-

$ sed 's/old-text/new-text/' file

例如,要在名为"file.txt"的文件中将所有出现的单词"old"替换为"new",请使用以下命令:-

$ sed 's/old/new/' file.txt

删除行

另一个有用的命令是 d 命令,它用于删除与特定模式匹配的行。例如,要删除名为"file.txt"的文件中包含单词"remove"的所有行,请使用以下命令: -

$ sed '/delete/d' file.txt

插入和追加

"a"命令用于在特定行后插入文本。例如,要在名为"file.txt"的文件的第五行后插入单词"new",请使用以下命令:

$ sed '5a new' file.txt

"i"命令用于在特定行前插入文本。例如,要在名为"file.txt"的文件第五行之前插入单词"new",请使用以下命令:

$ sed '5i new' file.txt

单个 sed 命令

让我们通过学习运行 sed 命令的不同方法,将目前学到的知识付诸实践。首先,让我们看看如何在 Unix shell 中运行单个 sed 命令:

$ sed [-Ealn] [-i extension] command [file ...]

除了编辑文件内容外,我们还应该能够查看它们。让我们看看如何使用 print 函数并执行相应的 sed 命令 -

$ sed 'p' input.txt
line-1
line-1
line-2
line-2

我们可以看到,当显式使用 print 函数时,每行都会打印两次。这是因为 sed 始终会执行默认操作,即在所有命令执行完毕后打印每一行。此外,为了抑制此默认行为,我们可以在同一命令中使用 -n 标志来控制打印操作 -

$ % sed -n 'p' input.txt
line-1
line-2

多个 sed 命令

既然搜索对于文本处理至关重要,那么如果我们能够使用自己的 sed 命令来实现这一功能,那岂不是很棒?是的,完全有可能!

那么,让我们继续使用 sed 获取 input.txt 文件中包含单词"line"的第一行 -

$ sed -n -e '/line/ p' -e '/line/ q' input.txt
line-1

需要注意的是,我们使用"-e"标志来分隔 sed 命令。第一个命令找到模式并使用 print 函数打印该行。第二个命令利用了 q 函数,而 quit 会中断 sed 命令在输入流上的执行。如果没有 q 函数,sed 将打印所有与正则表达式匹配的行。

或者,我们也可以用分号分隔多个命令 -

$ sed -n '/line/ p; /line/ q' input.txt
line-1

使用 sed 进行查找和替换

sed 提供了多种函数可用于查找和替换文本。让我们来探索一些重要的函数。

基本替换

假设我们的团队遵循使用空格进行代码缩进的惯例。然而,我们经常使用制表符。因此,我们的同事经常在代码审查周期中要求我们将制表符改为空格。为了解决此用例,我们可以使用 replace 函数 -

[address[,address]]s/regular expression/replacement/flags

因此,替换函数会在从地址范围中选择的每一行中搜索正则表达式。然后,它只用替换字符串替换第一个匹配的子字符串,除非我们使用标志覆盖此默认行为。由于我们打算重复使用我们的解决方案,因此我们将 sed 命令添加到名为"indentation_fix.sed"的脚本中 -

/^[ ]+/ s/ / /g

使用池化进行替换

有时我们经常需要在代码中进行语法修复。让我们以访问 Java 字符串中的字符为例,我们错误地将其视为数组,就像许多其他编程语言(例如 C −

)中的情况一样
String name = "string";
if (name.length() > 0) {
   System.out.println("Name starts with " + name[0]);
}

相反,我们应该使用 charAt() 方法来访问位置 0 处的字符。由于文件中可能有多处出现此错误,因此使用 sed 进行此更改可以节省时间。

$ sed -i 's/(name)[ ]*[[ ]*]/\1.charAt(0)/g' input.txt

此命令使用池化匹配整个模式"name[0]",并将其替换为"name.charAt(0)"。

结论

总而言之,sed 是一款功能强大的文本流编辑工具。它具有丰富的文本匹配和替换功能,适用于各种用例。通过本指南,我们学习了 sed 的基础知识,以及如何在不同场景下运行命令,包括替换、删除、插入和添加。我们还探索了分组和就地编辑等高级功能,以帮助您掌握这款多功能工具的使用方法。


相关文章


有用资源