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.