Переформатирование отрицательных чисел с помощью sed или awk

Переформатирование отрицательных чисел с помощью sed или awk

У меня есть текстовый файл, содержащий несколько отрицательных чисел, за исключением того, что они отформатированы следующим образом:

00000012-

С дефисом после числа.

Я обрабатываю файл с помощью awk, чтобы переформатировать его в команды вставки SQL, и интерпретатор SQL не может обработать число, поскольку после числа стоит знак «минус».

Существует ли регулярное выражение, которое может переместить знак «минус» перед числом?

решение1

С sed:

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

дает -00000012.

То есть сопоставление двух групп, первой с цифрами, а второй со знаком, но с использованием нуля или более совпаденийчто, а затем заменив два поменянных местами.

решение2

Вместо этого положитесь на SQL, чтобы решить проблему:

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

Затем используйте массовую вставку, чтобы извлечь значения из #Temptвашей фактической таблицы.


Взято изМассовая вставка отрицательных значений.

Почему люди всегда ожидают, что программисты будут убирать подобные глупости?

Ты не единственный...

решение3

С sed:

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

или

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

С помощью GNU awk:

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

gensub()ПРИМЕЧАНИЕ: для работы требуется GNU awk . Ни один sub()из них не gsub()поддерживает группы захвата.

С perl:

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

Связанный контент