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


84

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

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

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

我要删除字符串,并在文件中后,所有行,因此它会删除The third line,并The fourth line在除了字符串。该文件将变为:

The first line

我在google上搜索了一个解决方案,似乎应该使用sed。就像是:

sed 'linenum,$d' file

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


您的问题陈述是矛盾的:“我要删除该行之后的所有行”意味着您仅删除了两行(如您所说),但是随后您的示例输出显示匹配行也丢失了。您到底想要哪一个?
乔纳森·莱夫勒

匹配行及其后的所有行。我应该提高我的英语水平。感谢你的信息。
DocWiki 2011年

Answers:


136

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

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


3
但是有些命令会引起管道破裂的麻烦(co -p例如,RCS ),因此最好使用这种sed '/The second line/,$d'符号。
乔纳森·勒夫勒

你能补充说明吗?
Ahmad Abdelghany17年

@AhmadAbdelghany:添加了说明。
暂停,直到另行通知。

@DennisWilliamson非常感谢。
艾哈迈德·阿卜杜勒加尼

第一种方法将匹配行之前的最后一行打印两次。删除p后的;作品。
CrazyFrog

27

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

 sed '/The second line/Q' file

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

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

1
到目前为止,这是我最喜欢的解决方案。
TryTryAgain

5
sed '/The second line/q0' file

或者,不使用gnu sed:

sed '/The second line/q' file

或者,使用grep:

grep -B 9999999 "The second line"

非常感谢!您能告诉我如何找到特定字符串的行号,但我仍然不知道。
DocWiki 2011年

grep -n“第二行”文件| awk -F:'{print $ 1}'
Erik

@DocWiki:您不需要行号;您搜索它。 sed "/$string/,\$d" inputfile
乔纳森·莱夫勒

5

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

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

这是最佳答案,因为您可能不知道第二行的值。
罗恩

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.