I know there is a similar question in SO How can I replace mutliple empty lines with a single empty line in bash?. But my question is can this be implemented by just using the sed
command?
Thanks
I know there is a similar question in SO How can I replace mutliple empty lines with a single empty line in bash?. But my question is can this be implemented by just using the sed
command?
Thanks
Give this a try:
sed '/^$/N;/^\n$/D' inputfile
Explanation:
/^$/N
- match an empty line and append it to pattern space.;
- command delimiter, allows multiple commands on one line, can be used instead of separating commands into multiple -e
clauses for versions of sed
that support it./^\n$/D
- if the pattern space contains only a newline in addition to the one at the end of the pattern space, in other words a sequence of more than one newline, then delete the first newline (more generally, the beginning of pattern space up to and including the first included newline)/.../
match lines via regexp, ^$
regex match empty line (beginning of line followed by end of line) N
append next line to current line, so now we should have a blank line a newline and another blank line ;
I didn't find anything about this in the manual, maybe this means "branch if line matches" eg "do the next command for double empty lines", /^\n$/
regex match empty line newline empty line and use D command, which I think deletes the selection even if it contains newlines
Commented
May 15, 2020 at 21:30
sed -e s,\ \+,,g -e /^\$/N\;/^\\n\$/D < data
Commented
May 15, 2020 at 21:34
You can do this by removing empty lines first and appending line space with G command:
sed '/^$/d;G' text.txt
Edit2: the above command will add empty lines between each paragraph, if this is not desired, you could do:
sed -n '1{/^$/p};{/./,/^$/p}'
Or, if you don't mind that all leading empty lines will be stripped, it may be written as:
sed -n '/./,/^$/p'
since the first expression just evaluates the first line, and prints it if it is blank.
Here: -n option suppresses pattern space auto-printing, /./,/^$/ defines the range between at least one character and none character (i.e. empty space between newlines) and p tells to print this range.
Since "empty lines" can contain "invisible" whitespaces, tabs, \f
, \v
, \r
, etc.; in more general contexts we can use
sed -zE 's/([ \t\f\v\r]*\n){3,}/\n\n/g' inputfile