Regex 用于删除尾随零的sed-正则表达式-非正则表达式

Regex 用于删除尾随零的sed-正则表达式-非正则表达式,regex,sed,non-greedy,Regex,Sed,Non Greedy,我有一个文件,其中有几行如下 ABCD|100.19000|90.100|1000.000010|SOMETHING BCD|10.100|90.1|100.019900|SOMETHING 现在,在应用了sed之后,我希望输出如下(用于进一步处理) i、 e.我希望从结果中删除所有尾随的零(在|之前的零) 我尝试了以下方法:(regtest是包含原始数据的文件,如上所示) 因为我认为它很贪婪,所以没有起作用 cat regtest | sed 's/|\([0-9]*\)\.\([0-9]*

我有一个文件,其中有几行如下

ABCD|100.19000|90.100|1000.000010|SOMETHING
BCD|10.100|90.1|100.019900|SOMETHING
现在,在应用了
sed
之后,我希望输出如下(用于进一步处理)

i、 e.我希望从结果中删除所有尾随的零(在
|
之前的零)

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

因为我认为它很贪婪,所以没有起作用

cat regtest | sed 's/|\([0-9]*\)\.\([0-9]*\)0|/|\1\.\2|/g'
会有用的。但是,我必须在同一个文件上重复应用这个
sed
命令,以逐个删除零。没有道理


我该怎么做呢?谢谢

如果您想依赖要删除的零后面的|号

$ 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
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'

如果您想依赖于要删除的零后面的|

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'
使用Perl的

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

使用Perl的


这将删除(一个点和可选的一些数字)和(一条管道或线的末端)之间出现的零。

当小数点后只有零时,所需的输出是什么?没有小数点,只有小数点,或者小数点后面只有一个零?这种情况不需要处理,因为我已经单独处理过了…当小数点后面只有零时,期望的输出是什么?没有小数点,一个小数点,或者一个小数点后面有一个零?这种情况不需要处理,因为我已经单独处理了…谢谢。我有个问题。为什么这个和你建议的类似的不起作用?->sed's/([0-9])0+/\1/g。另外,如果我想确保只替换十进制的值(比如说我们有ABCD000,它应该被忽略),我应该怎么做?现在只对数字进行替换。Pyroscope,10.10.100也被这样替换。请看我下面的评论(克里斯)。对于我之前的评论,我使用的是普通的sed正则表达式&而不是扩展正则表达式。我本应该逃过brakcets“(“&”)”,但即使我逃过brakcets,输出也与您之前建议的不匹配。那么,它是否与使用-r aka extended有关?谢谢。我有个问题。为什么这个和你建议的类似的不起作用?->sed's/([0-9])0+/\1/g。另外,如果我想确保只替换十进制的值(比如说我们有ABCD000,它应该被忽略),我应该怎么做?现在只对数字进行替换。Pyroscope,10.10.100也被这样替换。请看我下面的评论(克里斯)。对于我之前的评论,我使用的是普通的sed正则表达式&而不是扩展正则表达式。我本应该逃过brakcets“(“&”)”,但即使我逃过brakcets,输出也与您之前建议的不匹配。那么,它是否与使用-r aka extended有关?谢谢。我想确保只有零以管道结尾,但小数部分被替换。i、 e 12.6200或0.100000应具有影响。ABCD0000应该保持不变。可以做什么?cat regtest | sed-r's/(\[1-9])*(00*)(\\[124;)/\ 1\3/g'谢谢。但是,这仍然没有达到我的预期。正如我在上面的评论中所说,只需替换十进制值。正确的值,如10.900或9.9998800等。这里,如果我说的是10.10.10(文件中的一些数据与此类似),那么它也会被替换。有什么可以补充的吗?谢谢。我想确保只有零以管道结尾,但小数部分被替换。i、 e 12.6200或0.100000应具有影响。ABCD0000应该保持不变。可以做什么?cat regtest | sed-r's/(\[1-9])*(00*)(\\[124;)/\ 1\3/g'谢谢。但是,这仍然没有达到我的预期。正如我在上面的评论中所说,只需替换十进制值。正确的值,如10.900或9.9998800等。这里,如果我说的是10.10.10(文件中的一些数据与此类似),那么它也会被替换。有什么可以补充的吗?谢谢,伙计。但是,我正在寻找sed解决方案。谢谢,伙计。但是,我正在寻找一个sed解决方案。