La respuesta de αғsнιη funcionó para mí, pero me gustaría explicarlo un poco.
Estaba intentando algo como esto:
echo "1,,2,,,3,,,4,,,,5,,,,,,,,,,6" | sed 's/,,/,-,/g'
Que salidas
1,-,2,-,,3,-,,4,-,,-,5,-,,-,,-,,-,,-,6
Debido a los campos vacíos repetidos, la última coma es parte del primer reemplazo y el comienzo del siguiente reemplazo deseado, por lo que solo se reemplaza cada segundo campo vacío.
Ahora podrías hacer algo como:
echo "1,,2,,,3,,,4,,,,5,,,,,,,,,,6" | sed -e 's/,,/,-,/g' -e 's/,,/,-,/g'
o
sed 's/,,/,-,/g;s/,,/,-,/g'
Lo que reemplazará todas las celdas, ya que el segundo comando obtendrá las que se pierden, pero es un poco desordenado.
El comando de αғsнιη hace esencialmente lo mismo, usando una etiqueta y un salto, que no sabía que pudieras hacer.
sed ':MYLABEL; s/,,/,-,/g; t MYLABEL;'
salida:
1,-,2,-,-,3,-,-,4,-,-,-,5,-,-,-,-,-,-,-,-,-,6
Entonces, la primera parte del comando crea una etiqueta.
Entonces tenemos la misma sustitución.
Luego tenemos el comando t que significa saltar a la etiqueta si el comando de sustitución anterior fue exitoso.
Más información: http://www.grymoire.com/Unix/Sed.html#uh-59
foo,"bar, baz",bar
- que tiene dos celdas:foo
,bar, baz
ybar
) no es fácil de analizar (y modificar) consed
oawk
.