桑达 - 转换负到正数

问题描述:

我想所有的负数转变为正数且迄今已想出这个桑达 - 转换负到正数

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

,但它不工作,因为它输出:

3245 -45 -72

我以为用\ 1 \ 2我会得到正数呢?

我哪里错了?

+0

什么只是'sed的“S/- // g''? – ghoti

这可能会为你工作:

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

原因,为什么你的正则表达式失败是

  1. 你只是做一个单一的替换(无g

  2. 你更换没有最后的空间。

  3. 最后一个数字没有空间跟随,所以它总是失败。

这工作太但不优雅(只有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 '-' 
+0

感谢potong - 你能解释一下你的代码在这部分工作的方式:\([0-9] \ + \)....他们是否逃避了他们之后的价值观? – frodo

+1

@frodo我没有使用'-r'开关(扩展正则表达式)编写了正则表达式,所以为了让parens充当分组元字符,它们必须被转义,即'sed -r's /( [0-9] +)/.../''将被写入'sed's/\([0-9] \ + \)/.../''NB '+'也必须逃脱。 – potong

为什么不直接去掉 - 的?

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