Sed - 将负数转换为正数

时间:2011-12-07 17:05:41

标签: bash sed

我正在尝试将所有负数转换为正数,并且到目前为止已经提出了这个

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

但它输出不起作用:

3245 -45 -72

我想通过使用\ 1 \ 2我会得到正数吗?

我哪里错了?

4 个答案:

答案 0 :(得分:12)

为什么不删除-'s?

[root@vm ~]# echo "-32 45 -45 -72" | sed 's/-//g'
32 45 45 72

答案 1 :(得分:4)

我的第一个想法是不使用sed,如果你不需要。 awk可以理解他们是数字并且如此转换它们:

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

-vRS将“记录分隔符”设置为空格,-vORS将“输出记录分隔符”设置为空格。然后它只是检查每个值,看它是否小于0,如果是,则将它乘以-1,如果不是,则只打印数字。

在我看来,如果你没有 使用sed,这更“正确”,因为它会对数字这样的数字进行处理。

答案 2 :(得分:3)

这可能对您有用:

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

正则表达式失败的原因是

  1. 您只进行一次替换(无g

  2. 您的替代品最后没有空格。

  3. 最后一个号码后面没有空格,所以总是会失败。

  4. 这也可以,但不太优雅(仅限2位数字):

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

    当然仅限于此示例:

     echo "-32 45 -45 -72" | tr -d '-'
    

答案 3 :(得分:2)

您正在使用一串字符来处理数字。更合适的方法是将数字存储在数组中,并使用内置的Shell Parameter Expansion删除减号:

    [~] $ # 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
    [~] $