Можно ли дополнить целые числа нулями с помощью регулярных выражений? - PullRequest
20 голосов
/ 26 июня 2010

У меня есть ряд чисел различной длины (от 1 до 6 цифр) в некотором тексте.Я хочу выровнять длины всех этих чисел, добавив более короткие числа к нулям.

Например, следующие 4 строки -

A1:11
A2:112
A3:223333
A4:1333
A5:19333
A6:4

должны стать дополненными целыми числами

A1:000011
A2:000112
A3:223333
A4:001333
A5:019333
A6:000004

Я использую «sed» и следующее потрясающее выражение:

sed -e 's/:\([0-9]\{1\}\)\>/:00000\1/' \
    -e 's/:\([0-9]\{2\}\)\>/:0000\1/' \
    -e 's/:\([0-9]\{3\}\)\>/:000\1/' \
    -e 's/:\([0-9]\{4\}\)\>/:00\1/' \
    -e 's/:\([0-9]\{5\}\)\>/:0\1/'

Возможно ли сделать это в лучшем выражении, чем это?

Ответы [ 2 ]

29 голосов
/ 26 июня 2010

Вы можете заполнить его слишком большим количеством нулей, а затем оставить только последние шесть цифр:

sed -e 's/:/:00000/;s/:0*\([0-9]\{6,\}\)$/:\1/'

Результат:

A1:000011
A2:000112
A3:223333
A4:001333
A5:019333
A6:000004

Возможно, лучше использовать awk:

awk -F: '{ printf("%s:%06d\n", $1, $2) }'
1 голос
/ 26 июня 2010

Вот решение на Perl:

 perl -n -e 'split /:/;printf("%s:%06d\n", @_)'

Вы задали регулярное выражение, поэтому я искал двоеточие для разделения с помощью регулярного выражения, но в этом случае простой строки будет достаточно.

[pti@os5 ~]$ cat tst.txt | perl -n -e 'split /:/;printf("%s:%06d\n", @_)'
A1:000011
A2:000112
A3:223333
A4:001333
A5:019333
A6:000004
...