Intereting Posts
Миф или реальность: SELinux может ограничивать пользователя root? Курсор исчезает после входа в систему на xubuntu halt, poweroff, shutdown, reboot не требуют root? Как написать демона входа? Очень простой вопрос H / W с использованием трубы и grep Как безопасно завершить работу каждой работающей виртуальной машины во время перезапуска / завершения работы в Qubes OS 4.0 без остановки или задержки из-за тайм-аута? (системная проблема) Установлены 3 версии BerkelyDB Ошибка синтаксиса, сравнивающая поплавки с bc Ошибки от ifconfig? Можно ли заставить хром показать «значки управления окном» слева Как регистрировать все мои DNS-запросы? Установить приложение xdg-open по умолчанию для терминальной программы запуск исполняемого файла параллельно путем деления дерева входных каталогов Dropbox, notify-send и OSD вмешиваются в Ctrl-ярлыки Почему эта команда удаляет каждый пакет?

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

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

00000012-

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

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

Есть ли регулярное выражение, которое может перемещать отрицательный знак перед номером?

С sed :

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

дает -00000012 .

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

Вместо этого полагайтесь на 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 в любую вашу фактическую таблицу.


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

Почему люди всегда ожидают, что программисты очистят такие глупые вещи?

Вы не единственный …

С 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 }' 

ПРИМЕЧАНИЕ. Требуется GNU awk для функции gensub() . Группы sub() и gsub() поддерживают.

С perl:

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