Chinaunix

标题: 怎么把 +00500 处理为 +500?? [打印本页]

作者: 5itle    时间: 2011-11-14 15:25
标题: 怎么把 +00500 处理为 +500??
怎样应用sed

   怎么把+005000处理为 +5000
         把+000.50处理为 +0.5
         
示例数据:|+005000|+000.50|
    处理结果:|+5000|+0.5|




最好用sed
                         谢过各位。。。。。。。。。。。。。。。。。。。。。
作者: where27    时间: 2011-11-14 15:37
sed不会
来个awk的
  1. echo "|+005000|+000.50|"|awk -F\| '{for(i=1;i<=NF;i++)if($i)$i="+"$i+0}1' OFS=\|
复制代码

作者: zooyo    时间: 2011-11-14 16:21
提示: 作者被禁止或删除 内容自动屏蔽
作者: jason680    时间: 2011-11-14 16:56
本帖最后由 jason680 于 2011-11-14 17:18 编辑

同样的正则perl可以... sed还要再....

$ echo "|+000500|+000.50000|+001.501000|" | sed -r 's/\|\+0+/|+/g;s/\+\./+0./g;s/(\.[0-9]+?)0+\|/\1|/g'
|+500|+0.5000|+1.50100|

$ echo "|+000500|+000.50000|+001.501000|" | perl -pe  's/\|\+0+/|+/g;s/\+\./+0./g;s/(\.[0-9]+?)0+\|/\1|/g'
|+500|+0.5|+1.501|
作者: blackold    时间: 2011-11-14 17:08
回复 1# 5itle


    +0003.000 这种格式处理为 +3还是……?
作者: blackold    时间: 2011-11-14 17:19
回复 4# jason680


    Perler 会很失望吧。
作者: dn833    时间: 2011-11-14 17:29
sed 's/+00/+/g;s/\.50/.5/'

不知道这样能否让lz满意。。。。。
作者: jason680    时间: 2011-11-14 17:34
回复 6# blackold

Perl功能正常.... 但sed 不OK也....   

Perler要失望什么!!??
作者: blackold    时间: 2011-11-14 17:38
回复 8# jason680

比如,perl 不应该用\1吧?

sed 也可以实现的,关键要看正则怎么写。
作者: jason680    时间: 2011-11-14 17:47
回复 9# blackold


我不知道误会在那....

当我想到....
|+5000|+0.501000| 想要去除 小数000时.
(同时又不能不小心去除5000的零)
同样的正则sed无法做到....

请教黑哥,sed是否有更好的方法,让大家学习一下.谢谢
作者: blackold    时间: 2011-11-14 17:50
回复 10# jason680


    晕,没有什么误会啊,我只是随便说一下罢了,你想多了。
作者: blackold    时间: 2011-11-14 17:53
本帖最后由 blackold 于 2011-11-14 19:19 编辑

可以这样写,虽然不是很完美
$ cat urfile
+005000
+000.50
+00000.005
+000003333.050
+000003333.00

$ sed -r 's/\+(0+)?([0-9]+)((\.[0-9]*[1-9])0*)?/+\2\4/g' urfile
+5000
+0.5
+0.005
+3333.05
+3333.00


或者
sed -r 's/\+(0+)?([0-9]+)((\.[0-9])([0-9]*[1-9])?0*)?/+\2\4\5/g'
+5000
+0.5
+0.005
+3333.05
+3333.0

作者: blackold    时间: 2011-11-14 17:54
我只是觉得规范的perl 代码不应该那样写,没有别的想法,更加没啥恶意。
作者: wtuter    时间: 2011-11-14 18:42
回复 1# 5itle


    sed -r 's/(\+)00/\1/g'
作者: 5itle    时间: 2011-11-14 22:30
各位的方法我都试了, 都有一点小问题
我会把这个帖子关闭 重新开一个帖子
问题会尽量表述清楚

谢谢各位
作者: zooyo    时间: 2011-11-14 22:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: ljs4053    时间: 2011-11-14 23:33
回复 1# 5itle


echo "|+005000|+000.50|" |  sed 's/+0*/+/g'  | sed 's/+\.\(0*[^0]*\)[^|]*/+0\.\1/g'
|+5000|+0.5|
作者: yinyuemi    时间: 2011-11-15 02:59
回复 4# jason680
  1. echo "|+000500|+000.50000|+001.5001000|+000.05000|" |sed -r 's/\|\+0+/|+/g; s/(\.[0-9]*)([^0])0+\|/\1\2|/g;s/\+\./+0./g'
  2. |+500|+0.5|+1.5001|+0.05|
复制代码

作者: jason680    时间: 2011-11-15 09:31
回复 18# yinyuemi


是的.

嗯!!!这中间差异是....想法
  0.005123001020300000
我当时的想法是
   0\.[0-9]+?0+
[0-9]+? 非贪婪
0+取得后面全部的0

同样的想法,在Perl可行,但sed -r (regexp-extended)
可能本来就不支持(非贪婪),或有bug...

最后,必须加入一个,非零正则在前面
你用的[^0]
或黑哥的[1-9]

$ man sed
   ...
      -r, --regexp-extended
        use extended regular expressions in the script.

$ sed --version
GNU sed 版本 4.2.1
作者: yinyuemi    时间: 2011-11-15 09:42
回复 19# jason680


    恩,sed不支持非贪婪正则
作者: cjaizss    时间: 2011-11-15 10:31
sed 's/+00/+/g;s/\.50/.5/'

不知道这样能否让lz满意。。。。。
dn833 发表于 2011-11-14 17:29



    不是完全满足楼主的意思吧
作者: dn833    时间: 2011-11-15 10:36
回复 21# cjaizss


   
我也就是看到LZ的原题这么考虑的。。。。看来还得充分领悟精神。。。。
作者: cjaizss    时间: 2011-11-16 14:09
sed -nr 's/(\|\+)0+([1-9]|0\.|0\|)/\1\2/g;s/(\.[0-9]*[1-9])0+\|/\1\|/g;s/\.0+\|/\|/g;p'




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2