Why doesn't sed's automatic printing deliver the expected results?

Posted by CodeGnome on Stack Overflow See other posts from Stack Overflow or by CodeGnome
Published on 2012-06-29T14:20:13Z Indexed on 2012/06/30 21:16 UTC
Read the original article Hit count: 155

Filed under:

What Works

This sed script works as intended:

$ echo -e "2\n1\n4\n3" | sed -n 'h; n; G; p'
1
2
3
4

It takes pair of input lines at a time, and swaps the lines. So far, so good.

What Doesn't Work

What I don't understand is why I can't use sed's automatic printing. Since sed automatically prints the pattern space at the end of each execution cycle (except when it's suppressed), why is this not equivalent?

$ echo -e "2\n1\n4\n3" | sed 'h; n; G'
2
1
2
4
3
4

What I think the code says is:

  1. The input line is copied to the hold space.
  2. The next line is read into the pattern space.
  3. The hold space is appended to the pattern space.
  4. The pattern space (line1 + newline + line2) is printed automatically because we've reached the end of the execution cycle.

Obviously, I'm wrong...but I don't understand why. Can anyone explain why this second example breaks, and why print suppression is needed to yield the correct results?

© Stack Overflow or respective owner

Related posts about sed