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
g
global ):sed 's/ *, */,/g' file
Tempo para este comando: 3.056s, com
perl -p -e
em vez desed
5.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' file
Tempo para este comando: 10.365s, com
perl -p -e
em vez desed
9.060s -
E, finalmente, a versão abreviada com
\s
, que significa o mesmo que[:space:]
, mas é Sintaxe do Perl :sed 's/\s*,\s*/,/g' file
Tempo para este comando: 10.507s, com
perl -p -e
em vez desed
6.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.