Raw Input
"A",B,"C,D,E",F,G,"H,I",J,"K,L,M,N",O
Desired Output
"A",B,"C-D-E",F,G,"H-I",J,"K-L-M-N",O
Script and Comments
Script1
[ 1] :loop
[ 2] s/^((([^"]*"){2})*[^"]*"[^",]*),/\1-/
[ 3] t loop
Comments
  1. The `-r' option of GNU sed must be used to interpret REs as EREs.
  2. A comma is in a double-quoted string if there are odd number of double quotes preceding it.
  3. Step [1] is used to replace commas of this kind and they are replaced from right to left.
Script2
[ 1] s/"([^"]*")/"\n\1/g
[ 2] :loop
[ 3] s/\n([^",]*),/\1-\n/g
[ 4] /\n[^",]*,/b loop
[ 5] s/\n//g
Comments
  1. This script uses a different approach from the previous one.
  2. Step [1] insert a newline character as a mark after the opening quote of every quoted string.
  3. Step [3] replaces the leftmost comma of every quoted string and moves the mark to the right of the replaced comma.
  4. If there are commas to be replaced, Step [4] makes sed jump to Step [2] to start another iteration.