使用sed从文本文件中删除特定的行号?
我想从文件中删除一个或多个特定的行号。 我将如何使用sed来做到这一点?
如果你想删除第5行到第10行和第12行:
sed -e '5,10d;12d' file
这将把结果打印到屏幕上。 如果您想将结果保存到同一个文件中:
sed -i.bak -e '5,10d;12d' file
这会将文件备份到file.bak
,并删除给定的行。
还有awk
awk 'NR!~/^(5|10|25)$/' file
$ cat foo 1 2 3 4 5 $ sed -e '2d;4d' foo 1 3 5 $
您可以通过sed -i'33d'文件删除其行号的特定行
这将删除33行号码上的行并保存更新的文件。
这通常是反模式的症状。 产生行号的工具可能被replace为立即删除行的行。 例如;
grep -nh error logfile | cut -d: -f1 | deletelines logfile
(其中deletelines
是你想象中你需要的效用)是一样的
grep -v error logfile
话虽如此,如果您真的需要执行此任务,您可以从行号文件生成一个简单的sed
脚本。 幽默(但也许稍微混淆),你可以用sed
做到这一点。
sed 's%$%d%' linenumbers
它接受一个行号的文件,每行一个,并在标准输出上生成相同的行号,并在每个行号之后添加。 这是一个有效的sed
脚本,我们可以将其保存到文件中,或者(在某些平台上)pipe道到另一个sed
实例:
sed 's%$%d%' linenumbers | sed -f - logfile
在某些平台上, sed -f
不理解选项参数-
意味着标准input,因此必须将脚本redirect到临时文件,并在完成后清理它,也可以用/dev/stdin
或/proc/$pid/fd/1
如果你的操作系统(或shell)有。
与往常一样,您可以在-f
选项之前添加-i
以使sed
编辑目标文件,而不是在标准输出上生成结果。 在* BSDish平台上(包括OSX),您需要为-i
提供明确的参数; 一个常见的习惯用法是提供一个空的论据; -i ''
。
我想用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用来存储当前行号的variables。 -
%
给出两个整数相除的余数(或模数); -
nl=((NR-1)%BLOCKSIZE)+1
这里我们在variablesnl中写入当前块内的行号。 (见下文) -
||
和&&
是逻辑运算符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 | +-----+------+----------+------------+