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

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

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

我有一个string是其中一行: The second line

我想删除string和文件后面的所有行,所以除了string之外,它会删除The third lineThe fourth line 。 该文件将成为:

 The first line 

我在谷歌上search了一个解决scheme,似乎我应该使用sed 。 就像是:

 sed 'linenum,$d' file 

但是如何findstring的行号呢? 或者,我该怎么做呢?

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

 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了解更多信息。

这比其他给定的解决scheme稍微短一些。 退出使用大写Q避免打印当前行。

  sed '/The second line/Q' file 

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

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

或者,没有gnu sed:

 sed '/The second line/q' file 

或者,使用grep:

 grep -B 9999999 "The second line" 

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

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

首先添加行号并删除行

 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 
 awk '/The second line/{exit}1' file