2010-06-25 20 views
17

我在一些文本中有一系列不同长度的数字(从1到6位数)。我想通过用零填充较短的数字来平衡所有这些数字的长度。是否可以使用正则表达式填充零的整数?

E.g.下面的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/' 

是否有可能做到这一点的比这更好的表达?

回答

26

你可以有太多的零垫,然后只保留最后六位数字:

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) }' 
+0

也许使用'{6,}'来避免修剪最初长于6的数字? – gnarf 2010-06-25 21:44:58

+0

@gnarf:这不会修剪最初长于6的数字 - 它会填充它们,但无论哪种方式,您的建议都很好,所以我会更新答案。处理它的另一种方法可能是中止脚本。 – 2010-06-25 21:50:30

+1

这是一个sed表达的好主意 - 预填充,然后修剪!这完全符合我的目的。尽管awk在这个例子中会做得很好,但我正在处理的真实数据并不是很清晰。 - 谢谢Mark! – 2010-06-25 21:58:55

1

这是一个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 
相关问题