根据Stack Overflow问题中的答案如何使用 sed/grep 提取两个单词之间的文本?,我们可以获取两个单词之间的文本:
sed -n "/first/,/second/p" file
但是,如果我想获取单词和文件最后一行之间的文本,如下所示,该怎么办?
sed -n "/word/,/lastline/p" file
答案1
包括你要做的最后一行:
sed -n '/word/,$p'
这会匹配第一次出现的word
所有内容,直到最后一行并打印所有匹配项。
不包括最后一行:
sed '/word/,$!d;$d'
...删除否定的匹配然后删除最后一行。
为了从最后一场比赛到最后一行,你必须更加努力:
sed -e :n -e '/\n.*word/D;N;$q;bn'
它循环 - 它永远不会完成正常的sed
行循环,而是将下一个输入行附加到模式空间缓冲区并b
返回以再次执行此操作。但是当它在模式空间中至少有两行并且最后一个匹配时单词它删除缓冲区中的所有内容,但匹配的行除外单词。在最后一行,它只是quits
打破了循环。所以打印的内容是最后出现的包含以下内容的行中的所有内容单词到最后一行。
嗯......也许我让事情变得比它必须的更难:
sed 'H;$x;/word/h;$!d'
这样,每一行都会被附加以保留空间。但线路匹配单词然后覆盖保持空间。模式空间中除最后一行之外的每一行都将被删除。在最后一行,就在它附加到保持空间之后,保持空间和模式空间被交换(如果最后一行也包含单词)以及上次的一切单词打印覆盖保留空间。
答案2
也可以使用awk
包括与文件结尾的匹配
awk '/word/{x=1}x' file
第一个匹配之后直到文件结尾
awk 'x;/word/{x=1}' file