Sed - конвертировать отрицательные в положительные числа - PullRequest
2 голосов
/ 07 декабря 2011

Я пытаюсь преобразовать все отрицательные числа в положительные числа и до сих пор придумал это

echo "-32 45 -45 -72" | sed -re 's/\-([0-9])([0-9])\ /\1\2/p'

, но оно не работает, так как выводит:

3245 -45 -72

Я думал, что с помощью \ 1 \ 2 я получу обратно положительное число?

Куда я иду не так?

Ответы [ 4 ]

12 голосов
/ 07 декабря 2011

Почему бы просто не удалить "х"?

[root@vm ~]# echo "-32 45 -45 -72" | sed 's/-//g'
32 45 45 72
4 голосов
/ 07 декабря 2011

Моя первая мысль - не использовать sed, если не нужно. awk может понять, что это числа, и преобразовать их таким образом:

echo "-32 45 -45 -72" | awk -vRS=" " -vORS=" " '{ print ($1 < 0) ? ($1 * -1) : $1 }'

-vRS устанавливает "разделитель записей" в пробел, а -vORS устанавливает "разделитель выходных записей" в пробел. Затем он просто проверяет каждое значение, определяет, меньше ли оно 0, и умножает его на -1, если оно есть, а если нет, просто печатает число.

По моему мнению, если у вас нет для использования sed, это более "правильно", так как оно обрабатывает числа как числа.

3 голосов
/ 07 декабря 2011

Это может работать для вас:

 echo "-32 45 -45 -72" | sed 's/-\([0-9]\+\)/\1/g'

Причиной сбоя вашего регулярного выражения является

  1. Вы выполняете только одну замену (нет g)

  2. Ваша замена не имеет пробела в конце.

  3. Последнее число не имеет пробела после, поэтому оно всегда будет неудачным.

Это будет работать тоже, но менее элегантно (и только для двузначных чисел):

 echo "-32 45 -45 -72" | sed -rn 's/-([0-9])([0-9])(\s?)/\1\2\3/gp'

Конечно, только для этого примера:

 echo "-32 45 -45 -72" | tr -d '-'
2 голосов
/ 08 апреля 2016

Вы имеете дело с числами, как со строкой символов.Более подходящим было бы хранить числа в массиве и использовать встроенный Расширение параметров оболочки для удаления знака минус:

    [~] $ # Creating and array with an arbitrary name:
    [~] $ array17=(-32 45 -45 -72)
    [~] $ # Calling all elements of the array and removing the first minus sign:
    [~] $ echo ${array17[*]/-}
    32 45 45 72
    [~] $
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...