Text Processing with sed – Replace Spaces with Comma Selectively

sedtext processing

some name;another thing; random; value value value value value

I'm trying to replace the spaces that occur after the random; using sed. It's important to keep the spaces that is in some name for example.

This replaces all spaces with comma. How could I match a expression like *;*;*; and use sed with the rest of the line and replace spaces with comma?

sed -e 's/ /,/g'

Thanks

Best Answer

Using gsub() in awk on the last ;-delimited field:

$ awk -F ';' 'BEGIN { OFS=FS } { gsub(" ", ",", $NF); print }' file
some name;another thing; random;,value,value,value,value,value

Using sed and assuming we'd like to replace all spaces after the last ; with commas:

$ sed 'h;s/.*;//;y/ /,/;x;s/;[^;]*$//;G;s/\n/;/' file
some name;another thing; random;,value,value,value,value,value

Annotated sed script:

h               ; # Duplicate line into hold space
s/.*;//         ; # Delete up to the last ;
y/ /,/          ; # Change space to comma in remaining data
x               ; # Swap pattern and hold spaces
s/;[^;]*$//     ; # Delete from the last ;
G               ; # Append hold space delimited by newline
s/\n/;/         ; # Replace the embedded newline with ;
                ; # (implicit print)

The "hold space" is a separate storage buffer that sed provides. The "pattern space" is the buffer into which the data is read from the input and to which modifications may be applied.

Related Question