Eliminar espacios en blanco antes de ciertos caracteres

Eliminar espacios en blanco antes de ciertos caracteres

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 sedel 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.

información relacionada