Как найти и заменить значение столбца поля в UNIX

У меня есть файл со значением, которое указано с помощью |

 123-|aaa|bbb|123|123.0|123-|123.01-|-123.02|123.03-|aaa|bbb|123-|aaa-|-bbb|cc-cc|123.04-|aa123-|123.05- 

Мне нужно выбрать значения столбцов, которые заканчиваются на - , столбец, который должен быть выбран, должен быть числовым значением, а затем перемещать - до начала значения.

2 Solutions collect form web for “Как найти и заменить значение столбца поля в UNIX”

POSIXly:

 sed ':1 s/^\(.*|\)\{0,1\}\([0-9.]*[0-9][0-9.]*\)-\(|.*\)\{0,1\}$/\1-\2\3/ t1' . sed ':1 s/^\(.*|\)\{0,1\}\([0-9.]*[0-9][0-9.]*\)-\(|.*\)\{0,1\}$/\1-\2\3/ t1' 

Или с awk более интуитивно понятным способом:

 awk -F '|' -v 'OFS=|' '{ for (i = 1; i <= NF; i++) if ($i ~ /^[0-9]*(\.[0-9]+)?-$/) $i = "-" substr($i, 1, length($i)-1) print}' 

(эта версия более строгая в том, что она считает числом , например sed , например, 1...2 ).

На вашем входе это дает:

 -123|aaa|bbb|123|123.0|-123|-123.01|-123.02|-123.03|aaa|bbb|-123|aaa-|-bbb|cc-cc|-123.04|aa123-|-123.05 

Вы можете сделать это, привязав соответствие к началу строки или разделителю. Например, с расширенным регулярным выражением GNU sed:

 sed -r ':a; s/(^|\|)([0-9.]+)-(\||$)/\1-\2\3/; ta' infile 

Вывод:

 -123|aaa|bbb|123|123.0|-123|-123.01|-123.02|-123.03|aaa|bbb|-123|aaa-|-bbb|cc-cc|-123.04|aa123-|-123.05 
  • Проверьте, содержит ли строка строку подстроки
  • добавьте подкаталоги в $ PATH в bash, используя find
  • Проверьте, имеет ли переменная оболочки более одной строки с использованием встроенных модулей?
  • Невозможно сравнить результат lsb_release с строкой в ​​Bash
  • Как проверить строку в строке с помощью оператора if?
  • Перепишите аргументы перед передачей их команде
  • Есть ли простой способ получить массив всех аргументов, которые не начинаются с дефиса?
  • Как использовать grep и вырезать скрипт для получения URL-адресов веб-сайтов из файла HTML
  • Назначение по умолчанию для нулевой переменной с заменой команды
  • Заменить сложную строку в нескольких файлах
  • Переход от строки к массиву «слов» в Bash
  • Linux и Unix - лучшая ОС в мире.