我正在尝试将所有负数转换为正数,并且到目前为止已经提出了这个
echo "-32 45 -45 -72" | sed -re 's/\-([0-9])([0-9])\ /\1\2/p'
但它输出不起作用:
3245 -45 -72
我想通过使用\ 1 \ 2我会得到正数吗?
我哪里错了?
答案 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'
正则表达式失败的原因是
您只进行一次替换(无g
)
您的替代品最后没有空格。
最后一个号码后面没有空格,所以总是会失败。
这也可以,但不太优雅(仅限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
[~] $