开发者

sed for removing trailing zeroes - regex - nongreedy

开发者 https://www.devze.com 2023-03-25 14:58 出处:网络
I have a file which has few lines as below ABCD|100.19000|90.100|1000.000010|SOMETHING BCD|10.100|90.1|100.019900|SOMETHING

I have a file which has few lines as below

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

Now, after applying sed on this, I would like the output to be as below (To use it for further processing)

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

i.e. I would like all the trailing zeros (the ones before the |) to be removed from the result.

I tried the following: (regtest is the file containing the original data as shown above)

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

Did not work as I think it's greedy.

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

Will work. But, I will have to apply this sed command repeatedly on the same fil开发者_如何学Ce to remove the zeros one after another. Does not make sense.

How can I go about it? Thanks!


$ 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


If you want to depend on the | following the zeroes to be removed

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

If you want to remove zeroes not trailed by a . or a digit

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

(Note I'm using the 00* instead of 0+ to avoid unique features of GNU sed not available in other versions)

Edit: answer to comment request for removing trailing zeroes only between a decimal point and a pipe:

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


Using Perl's extended regular expressions

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

This removes zeroes that occur between (a dot and optionally some digits) and (a pipe or the end of the line).

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号