使用sed从文本文件中删除特定的行号?

问题描述:

我想从文件中删除一个或多个特定的行号。我将如何使用sed来做到这一点?使用sed从文本文件中删除特定的行号?

+1

你可以举一个你想要的更具体的例子吗?你将如何决定删除哪条线? – 2010-01-21 20:14:43

+1

根据行号 – 2010-01-21 20:15:43

如果你想通过10和12,删除线5:

sed -e '5,10d;12d' file 

这将结果打印到屏幕上。如果您想将结果保存到同一个文件:

sed -i.bak -e '5,10d;12d' file 

这将备份文件多达file.bak,并删除指定的线路。

+23

并非所有的unix都有“-i”的gnu sed。不要犯回落到“sed cmd file>文件”的错误,这会消灭你的文件。 – pra 2010-01-22 06:53:08

+2

如果我想删除第五行直到最后一行? – Michelle 2013-05-11 03:58:33

+8

@WearetheWorld'sed -e'5,$ d'文件' – 2013-05-11 20:12:30

$ cat foo 
1 
2 
3 
4 
5 
$ sed -e '2d;4d' foo 
1 
3 
5 
$ 

和awk,以及

awk 'NR!~/^(5|10|25)$/' file 
+0

注意:这个awk行对于我来说比sed变种更加可靠(在OS-X和Ubuntu Linux之间) – 2012-02-23 19:13:30

+1

请注意,这不会删除文件中的任何内容。它只是将没有这些行的文件打印到标准输出。因此,您还需要将输出重定向到临时文件,然后移动临时文件以替换原始文件。 – mivk 2015-06-05 09:00:35

我想提出使用awk的推广。

当文件由固定大小 的块和删除重复每个块的线制成, AWK可以以这样的方式

awk '{nl=((NR-1)%2000)+1; if ((nl<714) || ((nl>1025)&&(nl<1029))) print $0}' 
OriginFile.dat > MyOutputCuttedFile.dat 

很好地工作。在这个例子中,尺寸为块是2000年,我想打印行[1..713]和[1026..1029]。

  • NR是awk用来存储当前行号的变量。
  • %给出了两个整数除法的余数(或模数)
  • nl=((NR-1)%BLOCKSIZE)+1这里我们写入变量nl当前块内的行号。 (见下文)
  • ||&&是逻辑运算ORAND
  • print $0写全线

Why ((NR-1)%BLOCKSIZE)+1: 
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0. 
    +1 We add again 1 because we want to restore the desired order. 

+-----+------+----------+------------+ 
| NR | NR%3 | (NR-1)%3 | (NR-1)%3+1 | 
+-----+------+----------+------------+ 
| 1 | 1 | 0  |  1  | 
| 2 | 2 | 1  |  2  | 
| 3 | 0 | 2  |  3  | 
| 4 | 1 | 0  |  1  | 
+-----+------+----------+------------+ 

+2

我很佩服你实现你疯狂的名字的方式。 – 2015-04-23 08:09:54

您可以通过 sed的-i '33D' 文件

这与删除其行号特定一行将删除33行号码上的行并保存更新的文件。

这通常是反模式的症状。生成行号的工具可能会被替换为立即删除行的行。例如;

grep -nh error logfile | cut -d: -f1 | deletelines logfile 

(其中deletelines是您想象你需要的实用工具)是一样的

grep -v error logfile 

话虽如此,如果你是在一个情况下,你真的需要执行此任务,可以从行号文件生成一个简单的sed脚本。幽默(但也许稍微混淆),你可以用sed来做到这一点。

sed 's%$%d%' linenumbers 

此接受的行号,每行一个的一个文件,并产生,在标准输出,与d相同行号的每个后追加。这是一个有效sed脚本,我们可以保存到一个文件,或者(在某些平台上)管到另一个sed例如:

sed 's%$%d%' linenumbers | sed -f - logfile 

在某些平台上,sed -f不理解选项参数-意味着标准输入,因此必须将脚本重定向到临时文件,并在完成后将其清理干净,或者如果您的操作系统(或外壳)具有该文件,则可以用/dev/stdin/proc/$pid/fd/1替换单独的短划线。

与往常一样,您可以在-f选项之前添加-i,以便sed编辑目标文件,而不是在标准输出上生成结果。在* BSDish平台(包括OSX)上,您还需要提供一个明确的参数给-i;一个常见的习惯用法是提供一个空洞的论据; -i ''

+0

我不太同意“反模式的症状”。基于标记的文件类型(例如XML或JSON)在最后需要特定的行才能成为有效的文件。在这种情况下,通常是最合理的方法来删除这些行,将想要添加的内容放入文件中,然后重新添加这些行,因为将这些行直接放在一起可能会更加努力并且不利尽可能避免像sed这样的额外工具。 – 2017-11-12 12:02:12