Pregunta:
Estoy tratando de eliminar un espacio entre 2 cadenas, son así:
312.2 MB
123.34 KB
487.1 GB
Quiero cambiarlos a:
312.2MB
123.34KB
487.1GB
Lo he intentado y puedo conseguir:
echo "312.2 MB" | sed s/[0-9][[:space:]][GMK]//g
312.B
Pero cuando trato de hacer referencias inversas con sed
:
echo "312.2 MB" | sed s/\([0-9]\)[[:space:]]\([GMK]\)/\1/g
312.2 MB
Supongo que solo hay una coincidencia, y luego la referencia posterior es la coincidencia completa, pero:
echo "312.2 MB" | sed s/\([0-9]\)[[:space:]]\([GMK]\)/TRY/g
312.2 MB
Entonces, ya no funciona cuando uso el ()
para capturar los personajes
Probablemente la expresión regular no sea del todo correcta, pero no sé por qué.
Respuesta:
El problema es citar.
Debido a que no cita su comando sed
, el paréntesis \(...\)
fue interpretado por el shell antes de pasar a sed
.
Así que sed
trató como paréntesis literal en lugar de paréntesis de escape, sin referencia inversa afectada.
Necesitas:
echo "312.2 MB" | sed 's/\([0-9]\)[[:space:]]\([GMK]\)/\1\2/g'
para hacer que la referencia inversa se vea afectada y obtener lo que desea.
O más simplemente:
echo "312.2 MB" | sed 's/ //'