如何从匹配行之后删除文件中的所有行?

时间:2011-03-08 01:23:43

标签: linux bash sed

我有一个由几行文字组成的文件:

The first line
The second line
The third line
The fourth line

我有一个字符串,其中一行是:The second line

我想在文件中删除字符串及其后面的所有行,因此除了字符串之外,它还会删除The third lineThe fourth line。该文件将成为:

The first line

我在google上搜索了一个解决方案,似乎我应该使用sed。类似的东西:

sed 'linenum,$d' file

但是如何找到字符串的行号?或者,我该怎么做呢?

6 个答案:

答案 0 :(得分:103)

如果您不想打印匹配的行(或任何后续行):

sed -n '/The second line/q;p' inputfile

这表示“当您到达与模式退出匹配的行时,否则打印每一行”。 -n选项可防止隐式打印,并且需要p命令才能显式打印行。

sed '/The second line/,$d' inputfile

这表示“从匹配行开始删除输出中的所有行并继续到文件末尾”。

但第一个更快。但是它将完全退出处理,因此如果您有多个文件作为参数,则不会处理第一个匹配文件之后的文件。在这种情况下,删除表单更好。

如果您确实要打印匹配的行,而不是以下任何行:

sed '/The second line/q' inputfile

这表示“打印所有行并在达到匹配的行时退出”(未使用-n选项(无隐式打印)。

有关其他信息,请参阅man sed

答案 1 :(得分:20)

这比其他给定的解决方案稍短。 使用大写Q退出可以避免打印当前行。

 sed '/The second line/Q' file

要实际删除这些行,您可以使用相同的语法。

 sed -i '/The second line/Q' file

答案 2 :(得分:5)

sed '/The second line/q0' file

或者,没有gnu sed:

sed '/The second line/q' file

或者,使用grep:

grep -B 9999999 "The second line"

答案 3 :(得分:4)

使用awk(不显示匹配的行)

awk '/pattern/ {exit} {print}' file.txt

答案 4 :(得分:0)

首先添加行号并删除行

cat new.txt 
The first line
The second line
The third line
The fourth line

 cat new.txt  | nl
     1  The first line
     2  The second line
     3  The third line
     4  The fourth line



cat new.txt  | nl | sed  "/2/d"
     1  The first line
     3  The third line
     4  The fourth line

cat new.txt  |  nl |sed  "3d;4d"
     1  The first line
     2  The second line

使用awk

awk 'NR!=3 && NR!=4' new.txt 
The first line
The second line

答案 5 :(得分:0)

awk '/The second line/{exit}1' file