我有一个 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