Acho que sed
muitas vezes não consegue corresponder ao padrão dos espaços em branco. Considere os seguintes exemplos:
echo 'A B C' | sed 's/[ \t]*//g'
ABC
echo -e 'A\tB\tC' | sed 's/[ \t]*//g'
A B C
perl -e 'print "A B C\n"' | sed 's/[ \t]*//g'
ABC
perl -e 'print "A\tB\tC\n"' | sed 's/[ \t]*//g'
A B C
Alguém poderia explicar por que sed
às vezes não consegue corresponder aos espaços em branco?
Responder1
1.
echo -e 'A\tB\tC' | sed 's/[ \t]*//g'
A B C
Funciona para mim
$ echo -e 'A\tB\tC' | sed 's/[ \t]*//g'
ABC
Experimente isso
$ echo -e 'a\tb' | sed -e 's/[ \t]//'
ab
2.
perl -e 'print "A B C\n"' | sed 's/^[ \t]*//g'
A B C
sua string não contém um espaço no início ( ^
) da linha
Responder2
Algumas versões de sed
não suportam \t
e outras escapam no lado esquerdo de um comando de substituição.
Você pode encontrar informações sobre variações entre versões sed
noPerguntas frequentes.
Responder3
A segunda afirmação que você tem acima funciona na minha máquina (Ubuntu 10.10 amd64, sed versão 4.2.1, pacote sed versão 4.2.1-7) e eu realmente não tenho uma explicação de por que essa não funcionaria.
A terceira e a quarta são porque você está usando a âncora de início de linha (^), então seriaapenasretire o espaço em branco inicial e no texto de entrada, você não terá nenhum espaço em branco no início das linhas.
Responder4
Você deveria usar\spara corresponder ao espaço em branco e à tabulação:
echo 'A B C' | sed 's/\s//g'
ABC
echo -e 'A\tB\tC' | sed 's/\s//g'
ABC
perl -e 'print "A B C\n"' | sed 's/\s//g'
ABC
perl -e 'print "A\tB\tC\n"' | sed 's/\s//g'
ABC