Это практически невозможно из-за работы регулярных выражений. Как уже указывал jvb, решение является простым (хотя и не обязательно коротким), если известно максимальное количество последовательных исходных символов. Если нет, то можно сначала изменить все исходные символы, а затем снова изменить отдельные символы на втором шаге. Однако это работает только в том случае, если целевой символ не встречается во входном потоке или если вы можете использовать символ, о котором известно, что он не встречается во входном потоке, в качестве промежуточной цели.
Кроме того, вам нужно принять во внимание угловые случаи одиночного исходного символа, встречающегося в начале или конце строки. Таким образом:
tr ',' '|' < file | sed 's/\([^|]\)|\([^|]\)/\1,\2/;s/^|\([^|]\)/,\1/;s/\([^|]\)|$/\1,/'
или же
sed 's/,/|/g;s/\([^|]\)|\([^|]\)/\1,\2/;s/^|\([^|]\)/,\1/;s/\([^|]\)|$/\1,/' file
Решение с использованием языка, который имеет понятие длины строки, будет более надежным.