2010-06-25 50 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 
相關問題