桑达 - 转换负到正数
问题描述:
我想所有的负数转变为正数且迄今已想出这个桑达 - 转换负到正数
echo "-32 45 -45 -72" | sed -re 's/\-([0-9])([0-9])\ /\1\2/p'
,但它不工作,因为它输出:
3245 -45 -72
我以为用\ 1 \ 2我会得到正数呢?
我哪里错了?
答
这可能会为你工作:
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 '-'
答
为什么不直接去掉 - 的?
[[email protected] ~]# echo "-32 45 -45 -72" | sed 's/-//g'
32 45 45 72
+0
@frodo你能接受任何答案吗? 你有没有面对这个答案的任何问题 –
答
我的第一个想法是不使用sed,如果你不必。 AWK可以理解他们的号码,并将其转换正是如此:
echo "-32 45 -45 -72" | awk -vRS=" " -vORS=" " '{ print ($1 < 0) ? ($1 * -1) : $1 }'
-vRS设置“记录分隔符”的空间,-vORS设置了“输出记录分隔符”的空间。然后它简单地检查每个值,看看它是否小于0,如果它是-1则将其相乘,如果不是,则只打印该数字。
在我看来,如果你不有使用sed,这是更“正确的”,因为它把数字看作数字。
答
你正在处理数字和一串字符。更适当的将是存储在数组中,并使用内置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
[~] $
什么只是'sed的“S/- // g''? – ghoti