我正在尝试仅使用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
答案 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
版本进行类似转换。