Remove espaços em branco antes de certos caracteres

2

Estou tentando remover espaços do texto como:

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

para obter

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

Eu estava tentando com o comando sed :

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

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

(estou usando o Linux.)

    
por Kam 22.10.2016 / 20:06

1 resposta

4

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

$ echo $'Ala ma kota ,psa i kanarka\n, chyba . . .' | sed -zE 's/[[:space:]]([,.?!])//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 em uma linha por vez.

  • -E

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

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

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

    Se você deseja incluir outros sinais de pontuação, basta adicioná-los entre os colchetes com ,.?! .

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

Variação

Esta versão com um ou mais caracteres de espaço em branco antes dos sinais de pontuação:

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

Discussão

Na pergunta, há:

s/ ././g

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

    
por 22.10.2016 / 20:23