
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 sed
o 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.