Contents

删除文本文件中包含特定字符串的行

1. 简介

在本教程中,我们将学习如何使用 Linux 命令awk 、  grepsed 从包含特定字符串的文件中删除行。在此过程中,我们将讨论它们的异同。

2. 输入文件

对于本教程中演示的大多数命令,我们需要使用输入文件,所以让我们创建一个名为myfile.txt的文件:

Blogdemo is focused on the Java ecosystem, helping developers learn to implement better, more secure web applications with Spring.
We can find many articles and tutorials on the website.
Blogdemo offers a great range of Java tutorials.
The HttpClient Series contain very useful examples.
Please let us know if you have any question regarding the tutorial.

在接下来的几节中,我们将运行各种命令从示例文件中删除所有包含字符串“ Blogdemo ”的行。

3. 用grep删除行

grep 是 Linux 操作系统中最著名的文本处理命令之一。它允许我们在输入文件中搜索模式,并打印匹配的行。

在这种情况下,我们实际上想要打印不匹配的行,所以我们将使用*-v*选项,它执行反向匹配

$ grep -v "Blogdemo" myfile.txt > tmpfile && mv tmpfile myfile.txt

这只会给我们那些与指定模式不匹配的行

$ cat myfile.txt
We can find many articles and tutorials on the website.
The HttpClient Series contain very useful examples.
Please let us know if you have any question regarding the tutorial.

正如我们所见,我们省略了包含字符串“ Blogdemo ”的行,并将不匹配的行保存到临时文件中。然后我们用临时文件覆盖我们的原始文件

4.用awk删除行

awk命令内置在 Linux 操作系统中。通常被描述为一种脚本语言, awk非常强大,为我们提供了对输入数据执行各种操作的功能。

在这个例子中,我们可以看到通过使用一个简单的正则表达式,awk会给我们我们期望得到的结果。使用*/Blogdemo/*,我们将匹配任何带有字符串“ Blogdemo. ” 使用感叹号(!),我们否定条件以获得期望的结果:

$ awk '!/Blogdemo/' myfile.txt > tmpfile && mv tmpfile myfile.txt

同样,正如我们在grep中看到的那样,我们必须使用临时文件作为中间步骤。

由于GNU awk ( gawk ) 是一种广泛使用的 Awk 实现,值得一提的是,如果我们的gawk版本是4.1.0或更高版本,我们可以使用它的*inplace *编辑 扩展:

$ gawk -i inplace '!/Blogdemo/' myfile.txt

感谢gawk及其*inplace *扩展,我们不必手动处理文件重定向。

5. 使用sed删除行

到目前为止,我们已经学习了如何使用grep和 awk命令删除包含特定字符串的行。

另外,我们也可以使用sed命令来解决这个问题。

** sed命令有* -i 选项,它允许就地编辑文件*。-i选项采用可选的扩展名参数,以防我们想要将原始文件保存为具有该扩展名的备份。如果没有给出扩展名,备份将被跳过:

$ sed -i '/Blogdemo/d' myfile.txt

正如我们所见,我们使用正则表达式*/Blogdemo/匹配行,然后**使用d*运算符**删除匹配的行。

如果我们现在检查我们的文件,我们会看到包含“ Blogdemo ”的行已被删除。