Expressão regular não está funcionando no sed

2

Estou tentando usar sed para alterar o formato de números decimais em um arquivo CSV grande antes de importá-lo para um banco de dados SQLite. Todos eles têm duas casas decimais, podem ser vírgula de uso negativo como um separador decimal e, portanto, são escapados com aspas duplas. Eu estava tentando o seguinte:

sed 's/"(-?)([:digit:]+),([:digit:]{2})"/$1$2.$3/g' input.csv > output.csv

O regex parece funcionar em um editor de texto em uma amostra do arquivo, mas ao executá-lo através de sed , não há alterações no arquivo original. O que estou fazendo errado?

    
por user1608941 15.03.2014 / 09:53

2 respostas

1

Como -r não está disponível, use esta floresta de palito inclinada:

sed 's/"\(-?[[:digit:]]\+\),\([[:digit:]]\{2\}\)"/./g' input.csv > output.csv

sed -r é uma extensão do GNU. E, infelizmente, a maioria das ferramentas que usam expressões regulares implementam a linguagem de forma ligeiramente diferente (grep / sed, awk, perl, ...)

    
por 15.03.2014 / 14:11
0

Eu acho a sintaxe do Perl mais simples para essas coisas (estou ignorando as aspas, mas você pode adicioná-las se desejar):

perl -pe 's/(-*)(\d+),(\d{0,2})/$1$2.$3/g' input.csv > output.csv

Você também pode usar a opção -i para editar o arquivo original diretamente.

    
por 16.03.2014 / 06:22

Tags