Replace spaces with comma but not in the whole line
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.
Perl to the rescue!
perl -F';' -ne '$F[3] =~ s/ /,/g; print join ";", @F'
-n
reads the input line by line and process each line-F
splits each line on the given regular expression into the @F array=~
binds the substitution only to the fourth element of the @F array, i.e. after the element after "random"- join joins back the elements of the @F array into the output string
With GNU sed
$ s='some name;another thing; random; value value value value value'
$ echo "$s" | sed -E ':a s/^(.*random;.*) /\1,/; ta'
some name;another thing; random;,value,value,value,value,value
:a
labela
s/^(.*random;.*) /\1,/
here(.*random;.*)
will capture everything tillrandom;
in the input line and as many characters as needed till there is a space afterwards, then in the replacement section use backreference to preserve the captured string and change space to comma character- note that if there are more than one
random;
in the input, this will preserve spaces only till the first occurrence
- note that if there are more than one
ta
branch to labela
if the previous substitution succeeded