Existem três possibilidades com o sed:
-
O mais simples (correspondendo a um caractere de espaço zero ou mais vezes antes de uma vírgula e um caractere de espaço zero ou mais vezes após a vírgula, substituindo-o por apenas uma vírgula - e isso muitas vezes, usando a opção
gglobal ):sed 's/ *, */,/g' fileTempo para este comando: 3.056s, com
perl -p -eem vez desed5.932s -
[:space:]significa todos os caracteres de espaço em branco, sendo assim o mesmo que[ \t\r\n\v\f]. Este é o padrão POSIX :sed 's/[[:space:]]*,[[:space:]]*/,/g' fileTempo para este comando: 10.365s, com
perl -p -eem vez desed9.060s -
E, finalmente, a versão abreviada com
\s, que significa o mesmo que[:space:], mas é Sintaxe do Perl :sed 's/\s*,\s*/,/g' fileTempo para este comando: 10.507s, com
perl -p -eem vez desed6.126s
Todos resultam em
hi hello,new york,,,brazil site,brazil
january,month is feb,,,indiana jones
O tempo foi usado para um arquivo com 2 milhões de linhas (contendo o texto do exemplo das perguntas 1 milhão de vezes). O arquivo tinha 97MBytes de tamanho.
O primeiro comando parece ser o mais rápido com sed . O último comando é o mais rápido ao usar perl e levando em conta que substitui não apenas espaços, mas também tabstops, linefeed e assim por diante.