使用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中写入当前块内的行号。 (见下文)
  • ||&&是逻辑运算符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 | +-----+------+----------+------------+