Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replacing consecutively empty values in a CSV file

Tags:

regex

sed

perl

I have a line of text like:

value,value,,,value,value

I want the two empty values to be replaced with a different value. Something like:

value,value,hello,hello,value,value

I'm currently trying something like:

sed -e 's/^,/hello,/' -e 's/,$/,hello/' -e 's/,,/,hello,/g'

That catches blank values at the beginning, end and the middle. BUT, it doesn't catch two consecutive blank values in a row. How can I update the regular expression patterns so that an indefinite number of consecutive blank values can appear in the middle?

like image 421
Steve Prentice Avatar asked Feb 24 '23 19:02

Steve Prentice


2 Answers

What about this perl one-liner:

echo ',value,,,value,' | perl -pe 's/^(?=,)|(?<=,)(?=,|$)/hello/g'
# hello,value,hello,hello,value,hello
like image 58
mhyfritz Avatar answered Mar 05 '23 07:03

mhyfritz


I don't think you can do it with a single substitute command, since Sed only replaces non-overlapped occurrences of your pattern. This ugly hack could work, but requires you to prevent one more character (I choosed ';') in your values :

$ echo 'value,value,,,value,value' | sed -r 's/,/,;/g;s/(^|;)(,|$)/\1hello\2/g;s/,;/,/g'
value,value,hello,hello,value,value
like image 28
r3c Avatar answered Mar 05 '23 06:03

r3c