Ответ αғsнιη работал для меня, но я просто хотел бы немного его объяснить.
Я пытался что-то вроде этого:
echo "1,,2,,,3,,,4,,,,5,,,,,,,,,,6" | sed 's/,,/,-,/g'
Какие выводы
1,-,2,-,,3,-,,4,-,,-,5,-,,-,,-,,-,,-,6
Из-за повторяющихся пустых полей последняя запятая является частью первой замены и началом следующей требуемой замены, поэтому вы просто заменяете каждое второе пустое поле.
Теперь вы можете сделать что-то вроде:
echo "1,,2,,,3,,,4,,,,5,,,,,,,,,,6" | sed -e 's/,,/,-,/g' -e 's/,,/,-,/g'
или же
sed 's/,,/,-,/g;s/,,/,-,/g'
Который заменит все ячейки, поскольку вторая команда получит те, которые пропущены, но это немного грязно.
Команда αғsнιη делает по существу то же самое, используя метку и прыжок, чего я не знал, что вы могли бы сделать.
sed ':MYLABEL; s/,,/,-,/g; t MYLABEL;'
выход:
1,-,2,-,-,3,-,-,4,-,-,-,5,-,-,-,-,-,-,-,-,-,6
Итак, первая часть команды создает метку.
Тогда у нас такая же замена.
Затем у нас есть команда t, которая означает переход к метке, если предыдущая команда замещения была успешной.
Дополнительная информация: http://www.grymoire.com/Unix/Sed.html#uh-59.