sed - 如何只获取被替换的最后一行?

时间:2016-11-02 14:23:49

标签: macos awk sed

我正在尝试仅使用sed - (或者只有awk - )解决方案,该解决方案仅输出与替换模式匹配的最后一行。

到目前为止,我有一个解决方案,只输出与模式匹配的行,但我不知道如何仅提取这些剩余的行的最后一行。我尝试了$!d,但它只从初始输入中提取最后一行。

sed -E '/^.*\*\ *(Command Line Tools.*)\ *$/!d;s//\1/'

示例输入:

Software Update Tool
Copyright 2002-2015 Apple Inc.

Software Update found the following new or updated software:
   * Command Line Tools (OS X 10.11) for Xcode-7.3
        Command Line Tools (OS X 10.11) for Xcode (7.3), 178678K [recommended]
   * Command Line Tools (macOS Sierra version 10.12) for Xcode-8.1
        Command Line Tools (macOS Sierra version 10.12) for Xcode (8.1), 123638K [recommended]

示例输出:

Command Line Tools (macOS Sierra version 10.12) for Xcode-8.1

2 个答案:

答案 0 :(得分:1)

您可以使用以下GNU sed命令:

sed -n '/PATTERN/H;${x;s/.*\n//;p}' file

说明:

  • sed -n默认禁止输出
  • /PATTERN/是您要匹配的模式
  • H将当前匹配的行追加到保留缓冲区
  • $解决最后一行输入(仅适用于GNU sed)
  • x交换保留和模式缓冲区的内容
  • s/.*\n//替换包括模式缓冲区中最后一个换行符在内的所有内容。这实际上只留下了最后一场比赛 - 正如你所要求的那样。
  • p打印出来。

答案 1 :(得分:1)

awk将是直截了当的

$ awk '/pattern/{p=$0} END{print p}' file

tac协助

$ tac file | awk '/pattern/{print; exit}'

也可以与sed合并。

为了用匹配的模式替换线,一种替代方案是

 $ awk '/pattern/{p=gensub(/.*(pattern).*/,"\\1",1)} END{print p}' file

或使用tac版本进行类似转换。