Remova os espaços em branco antes de certos caracteres

Remova os espaços em branco antes de certos caracteres

Estou tentando remover espaços do texto como:

Ala ma kota ,psa i kanarka
, chyba . . .

para conseguir

Ala ma kota,psa i kanarka, chyba...

Eu estava tentando com sedo comando:

echo $'Ala ma kota ,psa i kanarka\n, chyba . . .' | sed 's/ ,/,/g' | sed 's/ ././g'

Funcionou, ,mas com pontos ou nova linha ainda há problema. Ele substitui ambos .e não os dois juntos.

(Estou usando Linux.)

Responder1

Usando GNU sed (que você possui porque marcou este Linux):

$ echo $'Ala ma kota ,psa i kanarka\n, chyba . . .' | sed -zE 's/[[:space:]]([,.?!])/\1/g'
Ala ma kota,psa i kanarka, chyba...

Como funciona

  • -z

    Isso diz ao sed para ler todo o texto de uma vez, em vez de ler uma linha de cada vez.

  • -E

    Isso diz ao sed para usar a sintaxe regex estendida. Isso elimina a necessidade de algumas barras invertidas feias.

  • s/[[:space:]]([,.?!])/\1/g

    Isso substitui qualquer espaço em branco seguido por ,, ., ?ou !, apenas pelo sinal de pontuação.

    Se quiser incluir outros sinais de pontuação, basta adicioná-los entre colchetes com a extensão ,.?!.

    [[:space:]]inclui não apenas espaços em branco, mas também tabulações e novas linhas, etc.

Variação

Esta versão com umou maiscaracteres de espaço em branco antes dos sinais de pontuação:

$ echo $'Ala ma kota   ,psa i kanarka  \n, chyba . . .' | sed -zE 's/[[:space:]]+([,.?!])/\1/g'
Ala ma kota,psa i kanarka, chyba...

Discussão

Na questão há:

s/ ././g

Observe que, em uma regex, .é um curinga: corresponde a qualquer coisa. Assim, .corresponde a um espaço em branco seguido porqualquerpersonagem. Esses dois caracteres são substituídos por .(porque o lado da substituição énãoum regex, o .é um período literal). Isso não é o que você esperava.

informação relacionada