Get text between a word and the last line

sedtext processing

According to the answers in Stack Overflow question How to use sed/grep to extract text between two words?, we can get text between two words:

sed -n "/first/,/second/p" file

But what if I want to get text between a word and the last line of the file, as in the following?

sed -n "/word/,/lastline/p" file

Best Answer

Including the last line you'd do:

sed -n '/word/,$p'

That matches the first occurrence of word all the way until the last line and prints all matches.

Not including the last line:

sed '/word/,$!d;$d'

...which deletes negated matches and then deletes the last line.

And to get from only the last match to the last line you have to try a little harder:

 sed -e :n -e '/\n.*word/D;N;$q;bn'

It loops - it never completes the normal sed line cycle but instead appends the next input line to the pattern space buffer and branches back to do so again. But when it has at least two lines in pattern space and the last matches word it deletes everything in the buffer but the line that matches word. On the last line it just quits and breaks the loop. So what gets printed is everything from the last occurring line containing word to the last line.

Hmmm... maybe I made that harder than it has to be:

sed 'H;$x;/word/h;$!d'

With that one every line is appended to hold space. But lines matching word then overwrite hold space. Every line in pattern space that is not the last line is deleted. And on the last line, just after it is appended to hold space, the hold and pattern spaces are exchanged (in case the last line also contains word) and everything from the last time word overwrote hold space is printed.

Related Question