sed line range, all but the last line

Viewed 26832

You can specify a range of lines to operate on. For example, to operate on all lines, (which is of course the default):

sed -e "1,$ s/a/b/"

But I need to operate on all but the last line. You apparently can't use arithmetic expressions:

sed -e "1,$-1 s/a/b/"

(I am using cygwin in this case, if it makes a difference)

5 Answers
sed -e "$ ! s/a/b/"

This will match every line but the last. Confirmed with a quick test!

Well, you could hack it with something like this:

sed -e "1,$(($(cat the-file | wc -l) - 1))s/a/b/"

Or, you could use tail instead:

(tail +1 the-file) | sed -e s/a/b/; tail -1 the-file
Related