
Estoy intentando eliminar espacios de texto como:
Ala ma kota ,psa i kanarka
, chyba . . .
para obtener
Ala ma kota,psa i kanarka, chyba...
Estaba intentando con sed
el comando:
echo $'Ala ma kota ,psa i kanarka\n, chyba . . .' | sed 's/ ,/,/g' | sed 's/ ././g'
Funcionó ,
, pero con puntos o líneas nuevas todavía hay problemas. Reemplaza a ambos .
y no a ambos juntos.
(Estoy usando Linux).
Respuesta1
Usando GNU sed (que tienes porque etiquetaste este Linux):
$ echo $'Ala ma kota ,psa i kanarka\n, chyba . . .' | sed -zE 's/[[:space:]]([,.?!])/\1/g'
Ala ma kota,psa i kanarka, chyba...
Cómo funciona
-z
Esto le indica a sed que lea todo el texto a la vez, en lugar de leer una línea a la vez.
-E
Esto le dice a sed que use la sintaxis de expresiones regulares extendida. Esto elimina la necesidad de algunas barras invertidas feas.
s/[[:space:]]([,.?!])/\1/g
Esto reemplaza cualquier espacio en blanco seguido de uno de
,
,.
,?
o!
, con solo el signo de puntuación.Si desea incluir otros signos de puntuación, simplemente agréguelos entre corchetes con el
,.?!
.[[:space:]]
incluye no sólo espacios en blanco sino también tabulaciones y nuevas líneas, etc.
Variación
Esta versión con unoo máscaracteres de espacio en blanco antes de los signos de puntuación:
$ echo $'Ala ma kota ,psa i kanarka \n, chyba . . .' | sed -zE 's/[[:space:]]+([,.?!])/\1/g'
Ala ma kota,psa i kanarka, chyba...
Discusión
En la pregunta hay:
s/ ././g
Tenga en cuenta que, en una expresión regular, .
hay un comodín: coincide con cualquier cosa. Por lo tanto, .
coincide con un espacio en blanco seguido decualquierpersonaje. Estos dos caracteres son reemplazados por .
(porque el lado de reemplazo esnouna expresión regular, .
es un punto literal). Esto no es lo que esperabas.