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

Jus*_*ier 222 unix sed line-numbers

我想从文件中删除一个或多个特定的行号.我怎么用sed这样做?

Bri*_*ell 349

如果要删除第5行到第10行和第12行:

sed -e '5,10d;12d' file
Run Code Online (Sandbox Code Playgroud)

这会将结果打印到屏幕上.如果要将结果保存到同一文件:

sed -i.bak -e '5,10d;12d' file
Run Code Online (Sandbox Code Playgroud)

这将备份文件file.bak,并删除给定的行.

  • 并非所有的unix都有"-i"的gnu sed.不要错误地回到"sed cmd file> file",这会消灭你的文件. (28认同)
  • @WearetheWorld`sed -e'5,$ d'file` (14认同)
  • @KanagaveluSugumar`sed -e'5d'file`.语法是`<address> <command>`; 其中`<address>`既可以是像`5`这样的单行,也可以是像`5,10`那样的一系列行,命令`d`删除给定的一行或多行.地址也可以是正则表达式,或美元符号`$`表示文件的最后一行. (14认同)
  • 如果我想删除第5行直到最后一行? (4认同)
  • 请注意,从第 5 行到第 10 行的所有行都包含在内。 (2认同)

小智 44

您可以通过sed -i'33d'文件删除包含其行号的特定单行

这将删除33行号上的行并保存更新的文件.

  • 关于在循环中删除错误行的评论:一定要从最大的行号开始,否则每个删除的行都会抵消行号...... (3认同)
  • 就我而言,“sed”删除了错误的行。所以我使用这种方法:`sed -i '0,/&lt;TARGET&gt;/{/&lt;NEW_VALUE&gt;/d;}' '&lt;SOME_FILE_NAME&gt;'`。谢谢! (2认同)
  • 同样在这里,我写了一个循环,奇怪的是,有些文件丢失了正确的行,但有些文件也丢失了另一行,不知道出了什么问题。(GNU/Linux bash4.2) 下面的 awk 命令在循环中运行良好 (2认同)

gho*_*g74 25

和awk一样

awk 'NR!~/^(5|10|25)$/' file
Run Code Online (Sandbox Code Playgroud)

  • 注意:awk系列对我来说比sed变种更可靠(在OS-X和Ubuntu Linux之间) (2认同)
  • 请注意,这不会删除文件中的任何内容.它只是将没有这些行的文件打印到stdout.因此,您还需要将输出重定向到临时文件,然后移动临时文件以替换原始文件. (2认同)

Mat*_*ery 16

$ cat foo
1
2
3
4
5
$ sed -e '2d;4d' foo
1
3
5
$ 
Run Code Online (Sandbox Code Playgroud)


tri*_*eee 6

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

grep -nh error logfile | cut -d: -f1 | deletelines logfile
Run Code Online (Sandbox Code Playgroud)

(deletelines你想象中你需要的实用程序在哪里)与之相同

grep -v error logfile
Run Code Online (Sandbox Code Playgroud)

话虽如此,如果您处于真正需要执行此任务的情况,您可以sed从行号文件生成一个简单的脚本.幽默地(但也许有点令人困惑)你可以这样做sed.

sed 's%$%d%' linenumbers
Run Code Online (Sandbox Code Playgroud)

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

sed 's%$%d%' linenumbers | sed -f - logfile
Run Code Online (Sandbox Code Playgroud)

在某些平台上,sed -f不理解选项参数-表示标准输入,因此您必须将脚本重定向到临时文件,并在完成后清理它,或者用/dev/stdin或者/proc/$pid/fd/1如果您的操作系统(或shell)替换单独的短划线有那个.

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