Reformatear números negativos con sed o awk

Reformatear números negativos con sed o awk

Tengo un archivo de texto que contiene algunos números negativos excepto que tienen el formato:

00000012-

Con el guión después del número.

Estoy procesando el archivo usando awk para reformatearlo en comandos de inserción SQL y el intérprete de SQL se ahoga con el número porque aparece el signo negativo después del número.

¿Existe una expresión regular que pueda mover el signo negativo antes del número?

Respuesta1

Con sed:

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

da -00000012.

Es decir, hacer coincidir dos grupos, el primero con dígitos y el segundo con un signo, pero usando cero o más coincidencias deeso, y luego reemplazando los dos intercambiados.

Respuesta2

En su lugar, confíe en SQL para solucionar el 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

Luego use la inserción masiva para extraer los valores de #Temptcualquiera que sea su tabla real.


Tomado deInsertar valores negativos en masa.

¿Por qué la gente siempre espera que los programadores limpien cosas tan tontas como ésta?

No eres el único...

Respuesta3

Con asiento:

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

o

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

Con GNU awk:

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

NOTA: requiere GNU awk para gensub()funcionar. Ni sub()tampoco gsub()apoyamos a los grupos de captura.

Con Perl:

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

información relacionada