如何从 txt 文件中删除特定行

如何从 txt 文件中删除特定行

我有一个 Bash 脚本,它将数据写入日志文件,然后我使用命令从中取出我想要的东西sed。这给了我一个文件data.txt。我想知道的是如何删除该data.txt文件中的特定行。

例如:

123
456
789

我想删除第二行,包含,456这样我就只有

123

789

我尝试过sed '2d' data.txt但是没有用。

我使用以下命令来data.txt创建log.log

sed -nE '1s/.{1}(.{2}).*/\1/p;' log.log >> data.txt

答案1

试试这个。这应该有效。

sed -i '2d' data.txt

除非您要将输出重定向到新文件,否则您必须-i在 sed 命令中添加标志。如果您不添加标志-i,sed 会将模式空间打印到 STDOUT,并且不会对原始文​​件进行任何更改。

自动备份选项

在没有进行适当备份的情况下修改文件是非常危险的。因此,sed 有其原生方法,可以在编辑之前备份文件,这是-i.bak一个选项。

因此,在上面的例子中,如果我们使用备份选项,命令将是。

sed -i.bak '2d' data.txt

因此它将从文件 data.txt 中删除第一行,并将创建带有.bak扩展名的原始文件的备份副本。

答案2

您知道,除了通过行号指定之外,您还可以通过匹配行的内容来实现,如果这更有用的话(听起来可能):

sed -i '/^456$/d' data.txt

答案3

使用awk

awk 'NR!=2{ print }' input-file > output-file

可以这样理解:如果记录数不等于 2,则打印该记录(行)。如果要删除第二行和第三行:

awk 'NR!=2 && NR!=3 { print }' input-file

如果您想要一个空行,如问题中所示,命令sed应如下所示:

 sed '2 s/^.*$//' input-file

第一个字符2是行号,后面跟着命令,该命令将从行首到行末的s所有字符替换为空字符串。在这种情况下,可以省略开始和结束字符。.*^$//

例子:

$ cat input-file
123
456
789
654

$ sed '2,3 s/.*//' input-file
123


654

答案4

此命令将删除第 2-4 行和第 6 行

sed -e '2,4d;6d' file

相关内容