我有一个文件,其中包含以下几行
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
命令,一个接一个地删除零。没有意义。
我该怎么办呢?谢谢!
答案 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'
这会删除(一个点和一些数字)和(一个管道或行尾)之间出现的零。