Linux sed 流编辑器指南


介绍

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

语法

sed 命令的基本语法如下:

$ sed 'command' file

命令周围的单引号非常重要,因为它们允许 sed 正确解释命令。`file` 是 sed 将操作的输入文件。Sed 也可以接受来自管道的输入,在这种情况下,不需要文件参数。

命令

替换

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 ...]

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

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

我们可以看到,当显式使用打印功能时,每一行都会打印两次。这是因为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 命令。第一个命令查找模式并使用打印功能打印行。而第二个命令利用q函数(quit),中断对输入流上 sed 命令的执行。如果没有q函数,sed 将打印所有与正则表达式匹配的行。

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

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

使用 sed 查找和替换

sed 提供了各种功能,我们可以使用这些功能来查找和替换文本。让我们探索一些重要的功能。

基本替换

假设我们的团队遵循使用空格进行代码缩进的约定。但是,我们经常最终使用制表符。结果,我们的同事经常要求我们在代码审查周期中将制表符更改为空格。为了解决这个用例,我们可以使用替换函数:

[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的基本知识以及如何在不同场景中运行命令,包括替换、删除、插入和添加。我们还探讨了分组和原地编辑等高级功能,以帮助您掌握此多功能工具的使用。

更新于:2023年2月13日

821 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.