NiklasMan
NiklasMan

Reputation: 95

Change three or more empty lines into two using bash, sed or awk

Lets say that we have string containing words and multiple empty lines. For instance

"1\n2\n\n3\n\n\n4\n\n\n\n2\n\n3\n\n\n1\n"

I would like to "shrink" three or more empty lines into two using bash, sed or awk to obtain string

"1\n2\n\n3\n\n4\n\n2\n\n3\n\n1\n"

Has anybody an idea?

Upvotes: 1

Views: 85

Answers (3)

Aaron
Aaron

Reputation: 24812

If the data isn't too voluminous and you have GNU sed, use sed -z to make it work on a single null-terminated record rather than one \n-terminated record per line :

sed -z 's/\n\n\n\n*/\n\n/g'

Or with extended regexs :

sed -zr 's/\n{3,}/\n\n/g'

Upvotes: 1

karakfa
karakfa

Reputation: 67527

with awk

$ awk -v RS= -v ORS='\n\n' 1 file

Upvotes: 2

melpomene
melpomene

Reputation: 85837

If perl is acceptable,

perl -00 -lpe1

ought to do it. It reads and outputs whole paragraphs, which has the side effect of normalizing 2+ newlines to just \n\n.

Upvotes: 1

Related Questions