sed для удаления конечных нулей - regex - nongreedy - PullRequest
0 голосов
/ 02 августа 2011

У меня есть файл, который имеет несколько строк, как показано ниже

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 ]

3 голосов
/ 02 августа 2011
$ 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 голос
/ 02 августа 2011

Если вы хотите зависеть от | по убираемым нулям

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

Если вы хотите удалить нули, не отслеживаемые a. или цифра

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'
0 голосов
/ 03 августа 2011

Использование расширенных регулярных выражений Perl

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

При этом удаляются нули, которые встречаются между (точкой и, возможно, несколькими цифрами) и (каналом или концом линии).

...