Esto es prácticamente imposible, debido a la forma en que funcionan las expresiones regulares. Como jvb ya señaló, una solución es simple (aunque no necesariamente corta) si se conoce el número máximo de caracteres de origen consecutivos. Si no, es posible cambiar todos los caracteres de origen primero, y luego volver a cambiar los caracteres individuales en un segundo paso. Sin embargo, esto solo funciona si el carácter de destino no aparece en la secuencia de entrada, o si puede usar un carácter que se sabe que no aparece en la secuencia de entrada como un objetivo intermedio.
Además, debe tener en cuenta los casos de esquina de un solo carácter de origen que aparece al principio o al final de la línea. Así:
tr ',' '|' < file | sed 's/\([^|]\)|\([^|]\)/\1,\2/;s/^|\([^|]\)/,\1/;s/\([^|]\)|$/\1,/'
o
sed 's/,/|/g;s/\([^|]\)|\([^|]\)/\1,\2/;s/^|\([^|]\)/,\1/;s/\([^|]\)|$/\1,/' file
Una solución que use un lenguaje que tenga una noción de longitud de cadena sería más robusta.