У меня есть текстовый файл, содержащий несколько отрицательных чисел, за исключением того, что они отформатированы следующим образом:
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'