![Reformatando números negativos com sed ou awk](https://rvso.com/image/89140/Reformatando%20n%C3%BAmeros%20negativos%20com%20sed%20ou%20awk.png)
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/'
dá -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 #Tempt
qualquer 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'