使用sed从文本文件中删除特定的行号?
如果你想通过10和12,删除线5:
sed -e '5,10d;12d' file
这将结果打印到屏幕上。如果您想将结果保存到同一个文件:
sed -i.bak -e '5,10d;12d' file
这将备份文件多达file.bak
,并删除指定的线路。
$ cat foo
1
2
3
4
5
$ sed -e '2d;4d' foo
1
3
5
$
和awk,以及
awk 'NR!~/^(5|10|25)$/' file
注意:这个awk行对于我来说比sed变种更加可靠(在OS-X和Ubuntu Linux之间) – 2012-02-23 19:13:30
请注意,这不会删除文件中的任何内容。它只是将没有这些行的文件打印到标准输出。因此,您还需要将输出重定向到临时文件,然后移动临时文件以替换原始文件。 – 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当前块内的行号。 (见下文) -
||
和&&
是逻辑运算OR和AND。 -
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 |
+-----+------+----------+------------+
我很佩服你实现你疯狂的名字的方式。 – 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 ''
。
我不太同意“反模式的症状”。基于标记的文件类型(例如XML或JSON)在最后需要特定的行才能成为有效的文件。在这种情况下,通常是最合理的方法来删除这些行,将想要添加的内容放入文件中,然后重新添加这些行,因为将这些行直接放在一起可能会更加努力并且不利尽可能避免像sed这样的额外工具。 – 2017-11-12 12:02:12
你可以举一个你想要的更具体的例子吗?你将如何决定删除哪条线? – 2010-01-21 20:14:43
根据行号 – 2010-01-21 20:15:43