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

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

00000012-

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

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

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

3 Solutions collect form web for “Переформатирование отрицательных чисел с помощью sed или awk”

С 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' 
  • Есть ли способ обнаружить нулевые байты (␀, NUL, \ 0) в sed?
  • Согласование шаблонов и удаление этого шаблона с помощью sed
  • Извлечь имя группы из `id` и сохранить ее в переменной
  • Я хочу найти дубликаты в файле и добавить символ в конец строки в первом совпадении
  • Есть ли способ использовать sed или awk для фильтрации данных внутри заархивированного файла?
  • Команда UNIX для замены в разделителе в зависимости от положения разделителя
  • У Busybox ASH внутри initrd есть проблема, когда трубопроводный тройник
  • Переключение с grep на sed
  • замена sed не будет работать (регулярное выражение)
  • Как вставить строку в текстовый документ прямо перед строкой, содержащей некоторый текст в bash?
  • разделить большой файл на новый файл с уникальными именами файлов
  • Linux и Unix - лучшая ОС в мире.