sed用于删除尾随零 - 正则表达式 - 非贪心

时间:2011-08-02 18:21:11

标签: regex sed non-greedy

我有一个文件,其中包含以下几行

ABCD|100.19000|90.100|1000.000010|SOMETHING
BCD|10.100|90.1|100.019900|SOMETHING

现在,在对此应用sed后,我希望输出如下(用于进一步处理)

ABCD|100.19|90.1|1000.00001|SOMETHING
BCD|10.1|90.1|100.0199|SOMETHING

即。我希望从结果中删除所有尾随零(|之前的零)。

我尝试了以下操作:( regtest是包含原始数据的文件,如上所示)

cat regtest | sed 's/|\([0-9]*\)\.\([0-9]*\)0*|/|\1\.\2|/g'

不行,因为我觉得它很贪心。

cat regtest | sed 's/|\([0-9]*\)\.\([0-9]*\)0|/|\1\.\2|/g'

会工作吗?但是,我必须在同一个文件上重复应用此sed命令,一个接一个地删除零。没有意义。

我该怎么办呢?谢谢!

3 个答案:

答案 0 :(得分:3)

$ echo "ABCD100|100.19000|90.100|1000.000010|STH" | \
  sed -r -e 's/\|/||/g' -e 's/(\|[0-9.]+[1-9])0+\|/\1|/g' -e 's/\|\|/|/g'
ABCD100|100.19|90.1|1000.00001|STH

答案 1 :(得分:1)

如果你想依赖|跟随要删除的零

cat regtest | sed -r 's/(00*)(\|)/\2/g' 

如果你想删除没有落后的零。或数字

cat regtest | sed -r 's/(00*)([^.0-9])/\2/g'

(注意我使用00 *而不是0+来避免其他版本中没有的GNU sed的独特功能)

编辑:回答仅在小数点和管道之间删除尾随零的注释请求:

cat regtest | sed -r 's/(\.[1-9])*(00*)(\|)/\1\3/g'

答案 2 :(得分:0)

使用Perl的extended regular expressions

perl -pe 's{\.\d*?\K0*(\||$)}{$1}g'

这会删除(一个点和一些数字)和(一个管道或行尾)之间出现的零。