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 #Tempt
cualquiera 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'