Можно ли использовать целые числа с нулями с использованием регулярных выражений?
У меня есть ряд чисел разной длины (от 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" и следующее combersome выражение:
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/'
Можно ли сделать это в лучшем выражении, чем это?
Ответы
Ответ 1
Вы можете наложить его на слишком много нулей, а затем сохранить только последние шесть цифр:
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:%06s\n", $1, $2) }'
Ответ 2
Вот решение perl:
perl -n -e 'split /:/;printf("%s:%06d\n", @_)'
Вы задали регулярное выражение, поэтому я искал двоеточие для разделения с регулярным выражением, но в этом случае достаточно простой строки.
[[email protected] ~]$ cat tst.txt | perl -n -e 'split /:/;printf("%s:%06d\n", @_)'
A1:000011
A2:000112
A3:223333
A4:001333
A5:019333
A6:000004