如何在Unix sh中删除以"string"开头的所有行?

32

在sh中,如何删除文件中以"string"开头的所有行?我在考虑使用sed命令。

4个回答

37
grep -v '^string' yourfile.txt > stripped.txt

同一个文件之外怎么样? - t3hcakeman
不能用grep实现真正的原地编辑,但是你可以将输出写入临时文件,然后使用mv tempfile origfile命令进行替换。如果你想要真正的原地编辑,那么需要使用sed/perl/awk等工具。 - Marc B
那么我该如何使用它们呢?:D - t3hcakeman
1
http://ptankov.wordpress.com/2008/04/09/howto-delete-a-line-in-place-with-gnu-sed/ - Marc B
没有起作用,只是重新打印了所有行,除了包含该字符串的行。 - t3hcakeman
显示剩余2条评论

36

如果您的sed支持-i选项,您可以在原地进行操作:

sed -i '/^string/d' input-file

(如果输入文件中包含以"string"开头的行,则会从文件中删除这些行。)

4
在使用-i选项时,sed期望有一个文件扩展名作为备份。在Mac OS X中,你需要非常谨慎,所以要明确地使用单引号:sed -i '' '/^string/d' input-file - Joel Bruner
3
在OSX中,默认的sed甚至不支持-i选项!我的个人偏好是从不使用-i,而是用Shell进行重定向。 - William Pursell
不需要使用 -e 吗? - Mausy5043
它在ksh中不起作用吗?如果文本中有“string-d”这一行呢?不起作用。 - rohansr002

3

你的答案中缺少了sed和grep的好朋友awk:

awk '!/^string/' inputfile > resultfile

1
我需要它在同一个文件中。 - t3hcakeman

1

您可以在 Ex 模式下使用 Vim:

ex -sc g/^string/d -cx file
  1. g 选择所有匹配的行

  2. d 删除

  3. x 保存并关闭


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接