У меня есть серия чисел различных длин (варьирующийся от 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/'
Действительно ли возможно сделать это в лучшем выражении, чем это?
Вы можете добавить в него слишком много нулей и оставить только последние шесть цифр:
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) }'
Вот решение 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