【问题标题】:How do I delete all lines in a file starting from after a matching line?如何从匹配行之后删除文件中的所有行?
【发布时间】:2011-07-10 18:46:52
【问题描述】:

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

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

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

【问题讨论】:

  • 您的问题陈述是矛盾的:'我想删除所有行之后行'意味着您只删除两行(如您所说),但是您的示例输出显示匹配线也丢失了。你真正想要哪个?
  • 匹配的行和它之后的所有行。我应该提高我的英语。感谢您的信息。
  • 如果我不想删除我搜索的行,那怎么做呢?

标签: linux bash sed


【解决方案1】:

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

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

【讨论】:

  • 但是有些命令对损坏的管道感到不安(例如 RCS co -p),然后你最好使用 sed '/The second line/,$d' 表示法。
  • 能否补充说明?
  • @AhmadAbdelghany:已添加说明。
  • @DennisWilliamson 非常感谢。
  • 第一种方法打印匹配行之前的最后一行两次。在; 工作后删除p
【解决方案2】:

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

 sed '/The second line/Q' file

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

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

【讨论】:

  • 这是迄今为止我最喜欢的解决方案。
【解决方案3】:

使用 awk(不显示匹配行)

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

【讨论】:

  • 这是最好的答案,因为您可能不知道第二行的值。
【解决方案4】:
sed '/The second line/q0' file

或者,没有 gnu sed:

sed '/The second line/q' file

或者,使用 grep:

grep -B 9999999 "The second line"

【讨论】:

  • 非常感谢!你能告诉我如何找到特定字符串的行号,我仍然不知道。
  • grep -n "第二行"文件 | awk -F : '{打印 $1}'
  • @DocWiki:你不需要行号;你搜索它。 sed "/$string/,\$d" inputfile.
【解决方案5】:

先添加行号,再删除行

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

【讨论】:

    【解决方案6】:
    awk '/The second line/{exit}1' file
    

    【讨论】:

      猜你喜欢
      • 2011-04-16
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多