Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

replace two newlines to one in shell command line

There are lot of questions about replacing multi-newlines to one newline but no one is working for me.
I have a file:

first line
second line MARKER

third line MARKER
other lines

many other lines

I need to replace two newlines (if they exist) after MARKER to one newline. A result file should be:

first line
second line MARKER
third line MARKER
other lines

many other lines

I tried sed ':a;N;$!ba;s/MARKER\n\n/MARKER\n/g' Fail.
sed is useful for single line replacements but has problems with newlines. It can't find \n\n

I tried perl -i -p -e 's/MARKER\n\n/MARKER\n/g' Fail.
This solution looks closer, but it seems that regexp didn't reacts to \n\n.

Is it possible to replace \n\n only after MARKER and not to replace other \n\n in the file?
I am interested in one-line-solution, not scripts.

like image 301
oluckyman Avatar asked Mar 01 '26 12:03

oluckyman


1 Answers

I think you were on the right track. In a multi-line program, you would load the entire file into a single scalar and run this substitution on it:

s/MARKER\n\n/MARKER\n/g

The trick to getting a one-liner to load a file into a multi-line string is to set $/ in a BEGIN block. This code will get executed once, before the input is read.

perl -i -pe 'BEGIN{$/=undef} s/MARKER\n\n/MARKER\n/g' input
like image 124
mob Avatar answered Mar 03 '26 03:03

mob



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!