Eu uso o Linux e o FreeBSD (especificamente, o Debian Linux e o PC-BSD), e achei algo estranho sed
.
Frequentemente, preciso converter arquivos "valores separados por tabulação" em "valores separados por vírgula". A maneira mais simples que eu sei é usar sed
, assim:
sed 's/\t/,/g' inputFile.txt > outputFile.csv
Isso funciona perfeitamente no Linux: ele substitui todas as guias por vírgula ... mas no FreeBSD, não substitui nada !!!
Estou esquecendo de algo? Existe uma sintaxe no FreeBSD sed
diferente da do Linux?
-E
opção faz o truque (no FreeBSD e no Mac OS X).Sim, existem várias diferenças, o comportamento de
-i
ser o único que eu conheço do topo da minha cabeça.Eu nunca usei o BSD, então não posso ajudar com os detalhes, mas uma solução alternativa pode ser usar
tr
:Um efeito colateral agradável é que
tr
deve ser significativamente mais rápido. Eu testei isso no meu Linux usando um arquivo de teste com 50000 linhas, cada uma das quais com 2 guias:fonte
tr '\t' ,
é mais portátil quetr $'\t' ,
.tr '[\t]' '[,]'
seria portátil para alguns sistemas SysV antigos.cut
. A especificação POSIX paratr
está lá . Eu estava errado sobre o[
necessário para o antigo SysV. Como as especificações do POSIX apontam,[
é necessário apenas para os intervalos lá.Sim, ao contrário do GNU
sed
FreeBSDsed
não interpreta seqüências de escape ANSI C, como\t
em expressões regulares.Uma maneira de obter um denominador menos comum nesse caso é usar
printf
.O comportamento das
sed -i
edições de arquivo no local pode ser compatível se uma opção ou opção seguir imediatamente a-i
opção, por exemplo,sed -i -e 's/x/X/g' file
funciona tanto para o GNUsed
quanto para o FreeBSDsed
.Versões recentes do FreeBSD
sed
(FreeBSD 8.1 ou mais recente) têm a-r
opção de aumentar a compatibilidade com o GNUsed
.(Além disso, o uso de classes de caracteres POSIX em
sed
expressões regulares também é uma boa maneira de garantir compatibilidade).Para uma alternativa,
sed
implementação compatível com POSIX, consulte: minised - uma implementação SED menor, mais barata e mais rápida .fonte
Você deve usar um TABcaractere literal em vez de
\t
:Veja este comentário de Stephane em outra pergunta.
O seguinte artigo também pode lhe interessar:
Cito a parte relevante:
fonte
Após o login, vejo o próximo anúncio e o salvo. Espero que seja útil para outros também
fonte
-i
opção já estava coberta , porém