0

我有一个文件,它有几行如下

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在同一个文件上重复应用此命令以一个接一个地删除零。没有意义。

我该怎么办?谢谢!

4

3 回答 3

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
于 2011-08-02T18:29:20.600 回答
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'
于 2011-08-02T18:42:51.000 回答
0

使用 Perl 的扩展正则表达式

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

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

于 2011-08-02T20:10:19.413 回答