## 34.19. Multiline Delete

The sed delete command, d, deletes the contents of the pattern space (Section 34.14) and causes a new line of input to be read, with editing resuming at the top of the script. The Delete command, D, works slightly differently: it deletes a portion of the pattern space, up to the first embedded newline. It does not cause a new line of input to be read; instead, it returns to the top of the script, applying these instructions to what remains in the pattern space. We can see the difference by writing a script that looks for a series of blank lines and outputs a single blank line. The version below uses the delete command:

>     # reduce multiple blank lines to one; version using d command
>     /^$/{
>        N
>        /^\n$/d
>     }

When a blank line is encountered, the next line is appended to the pattern space. Then we try to match the embedded newline. Note that the positional metacharacters, `^` and `$`, match the beginning and the end of the pattern space, respectively. Here's a test file:

>     This line is followed by 1 blank line.

>     This line is followed by 2 blank lines.

>     This line is followed by 3 blank lines.

>     This line is followed by 4 blank lines.

>     This is the end.

Running the script on the test file produces the following result:

>     % sed -f sed.blank test.blank
>     This line is followed by 1 blank line.

>     This line is followed by 2 blank lines.
>     This line is followed by 3 blank lines.

>     This line is followed by 4 blank lines.
>     This is the end.

Where there was an even number of blank lines, all the blank lines were removed. Only when there was an odd number of blank lines was a single blank line preserved. That is because the delete command clears the entire pattern space. Once the first blank line is encountered, the next line is read in, and both are deleted. If a third blank line is encountered, and the next line is not blank, the delete command is not applied, and thus a blank line is output. If we use the multiline Delete command, `/^\n$/D`, we get a different result, and the one that we wanted.

The reason the multiline Delete command gets the job done is that when we encounter two blank lines, the Delete command removes only the first of the two. The next time through the script, the blank line will cause another line to be read into the pattern space. If that line is not blank, both lines are output, thus ensuring that a single blank line will be output. In other words, when there are two blank lines in the pattern space, only the first is deleted. When a blank line is followed by text, the pattern space is output normally.

-- DD

Copyright © 2003 O'Reilly & Associates. All rights reserved.