Question more or less says it all. I’m aware that /^$/d will remove all blank lines, but I can’t see how to say ‘replace two or more blank lines with a single blank line’
Any ideas?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
If you aren’t firing vim or sed for some other use, cat actually has an easy builtin way to collapse multiple blank lines, just use cat -s.
If you were already in vim and wanted to stay there, you could do this with the internal search and replace by issuing: :%s!nnn+!^M^M!g (The ^M is the visual representation of a newline, you can enter it by hitting Ctrl+vEnter), or save yourself the typing by just shelling out to cat: :%!cat -s.
Method 2
Use n to indicate a newline in the search pattern. Use Ctrl+M in the replacement text, or a backreference. See :help pattern and :help sub-replace-special (linked from :help :s).
%s/(nn)n+/1/
Method 3
If in Vim, just do this:
:%!cat -s
The -s flag for cat squeezes multiple blank lines into one.
Method 4
Using Perl:
perl -00 -pe ''
-00 command line option turns paragraph slurp mode on, meaning Perl reads text paragraph by paragraph rather than line by line.
Method 5
With sed (GNU sed) 4.2.2:
sed -r '
/^s*$/ {
# blank line
:NEXT
N # append next line to pattern space - if none, autoprint PS and exit
s/^s*$n^s*$//g;t NEXT # if 2 blank lines, clear PS and loop to NEXT
}
# else, autoprint PS and next/exit
' < $MYFILE
Method 6
I know this is silly code, but I wanted to solve this issue in less than 10 min, and it worked
for file in /directory/* do originalname=$file us='_' tempname=$file$us echo $originalname mv $originalname $tempname uniq $tempname $originalname rm $tempname done
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0