cat -s (sed, a stream editor) (original) (raw)
7.20 Squeezing Blank Lines
As a final example, here are three scripts, of increasing complexity and speed, that implement the same function as ‘cat -s’, that is squeezing blank lines.
The first leaves a blank line at the beginning and end if there are some already.
#!/usr/bin/sed -f
on empty lines, join with next
Note there is a star in the regexp
:x /^\n*$/ { N bx }
now, squeeze all '\n', this can be also done by:
s/^(\n)*/\1/
s/\n*/
/
This one is a bit more complex and removes all empty lines at the beginning. It does leave a single blank line at end if one was there.
#!/usr/bin/sed -f
delete all leading empty lines
1,/^./{ /./!d }
on an empty line we remove it and all the following
empty lines, but one
:x /./!{ N s/^\n$// tx }
This removes leading and trailing blank lines. It is also the fastest. Note that loops are completely done with n
andb
, without relying on sed
to restart the script automatically at the end of a line.
#!/usr/bin/sed -nf
delete all (leading) blanks
/./!d
get here: so there is a non empty
:x
print it
p
get next
n
got chars? print it again, etc...
/./bx
no, don't have chars: got an empty line
:z
get next, if last line we finish here so no trailing
empty lines are written
n
also empty? then ignore it, and get next... this will
remove ALL empty lines
/./!bz
all empty lines were deleted/ignored, but we have a non empty. As
what we want to do is to squeeze, insert a blank line artificially
i\
bx