Reformatando números negativos com sed ou awk

Reformatando números negativos com sed ou awk

Eu tenho um arquivo de texto que contém alguns números negativos, exceto que eles são formatados como:

00000012-

Com o hífen após o número.

Estou processando o arquivo usando o awk para reformatá-lo em comandos de inserção SQL e o interpretador SQL está engasgando com o número porque o sinal negativo aparece após o número.

Existe uma regex que pode mover o sinal negativo antes do número?

Responder1

Com sed:

echo 00000012- |  sed -e 's/\([0-9]+\)\(-\)\?/\2\1/'

-00000012.

Isto é, combinando dois grupos, o primeiro com dígitos e o segundo com um sinal, mas usando zero ou mais correspondências dequee, em seguida, substituindo os dois trocados.

Responder2

Em vez disso, confie no SQL para corrigir o problema:

create table #Tempt (Value VarChar(100))

Insert Into #Tempt Values(NULL)
Insert Into #Tempt Values('500.1-')
Insert Into #Tempt Values('-500.1')
Insert Into #Tempt Values('20.5')


select *, case when Value like '%-' then '-' + replace(value,'-',') else value end
 From   #Tempt

Em seguida, use a inserção em massa para extrair os valores de #Temptqualquer tabela real.


Tirado deInserção em massa de valores negativos.

Por que as pessoas sempre esperam que os programadores limpem coisas idiotas como essa?

Você não é o único...

Responder3

Com sed:

sed -e 's/\<\([0-9.]\+\)-/-\1/g'

ou

sed -E -e 's/\<([0-9+]+)-/-\1/g'

Com GNU awk:

awk '{$0=gensub(/\<([0-9.]+)-/,"-\\1","g"); print }'

NOTA: requer GNU awk para gensub()funcionar. Nem sub()apoiam gsub()grupos de captura.

Com perl:

perl -p -e 's/\b([\d.]+)-/-$1/g'

informação relacionada