SED - 替换拖尾减号

时间:2014-06-10 02:05:16

标签: bash sed

晚安,

我正在尝试用前导减号替换尾随减号。下面的链接非常有用,但是我很难处理逗号和句号。例如:

输入数据:

|76534|     253,453.86-|       6/4/2012|  56487-56987|
|32567|      36,000.00|        7/8/2012|  45684-4541|
|58531|         400.56-|      10/5/2012|  15232-1254|
|12584|           5.56-|     12/12/2013|  125565-451|

期望的结果(所有其他列保持不变):

-253,453.86
  36,000.00
    -400.56
      -5.56

使用sed -r 's/([[:digit:]]+(\,[[:digit:]]+(\.[[:digit:]]+)?))-/-\1/'我已经能够用逗号处理数字,但如果可能的话,我想在一个命令中处理所有类型。

有用的链接: Replace a trailing minus with leading minus

6 个答案:

答案 0 :(得分:2)

$ awk 'BEGIN{FS=OFS="|"} sub(/-$/,"",$3){sub(/[^ ]/,"-&",$3)}1' file
|76534|     -253,453.86|       6/4/2012|  56487-56987|
|32567|      36,000.00|        7/8/2012|  45684-4541|
|58531|         -400.56|      10/5/2012|  15232-1254|
|12584|           -5.56|     12/12/2013|  125565-451|

答案 1 :(得分:1)

使用[[:digit:],.]创建一个包含数字,逗号和句点的字符类。其余的你已经知道该怎么做了。

sed -r 's/([[:digit:].,])-/-\1/'

答案 2 :(得分:1)

你可以这样做:

$ sed '/-$/{s/-$//;s/[0-9]/-&/;b};s/^/ /' file
-253,453.86
  36,000.00
    -400.56
      -5.56

更新的答案:

$ awk 'BEGIN{FS=OFS="|"}{for(i=1;i<=NF;i++)if($i~/-$/){sub(/-$/,"",$i);sub(/[0-9]/,"-&",$i)}}1' file
|76534|     -253,453.86|       6/4/2012|  56487-56987|
|32567|      36,000.00|        7/8/2012|  45684-4541|
|58531|         -400.56|      10/5/2012|  15232-1254|
|12584|           -5.56|     12/12/2013|  125565-451|

答案 3 :(得分:1)

这似乎适用于您的多列数据:

sed -r '{s#([0-9][0-9,.]*)-\|#-\1\|#g}'

答案 4 :(得分:1)

另一个通过GNU sed

$ sed -r 's/^(\|[0-9]+\|)( *?)([^|]*?)(-)(.*)$/\1\2\4\3\5/g' file
|76534|     -253,453.86|       6/4/2012|  56487-56987|
|32567|      36,000.00|        7/8/2012|  45684-4541|
|58531|         -400.56|      10/5/2012|  15232-1254|
|12584|           -5.56|     12/12/2013|  125565-451|

答案 5 :(得分:1)

一个简单的解决方案:

sed 's/\([^ ]*\)\-|/-\1|/' input