2013-07-02 61 views
0

我正在修改一個大的txt文件。有沒有一種方法可以用零填充字符串模式?例如,從一個或兩個小數點到三個。例如從0.21至0.210或0.5至0.500?我試圖代碼:Perl單行指定小數位

perl -p -i -e 's/(\.\d{1,2})/\10/g' myFile.txt 

預先感謝任何幫助:)

+3

使用'的sprintf()'用'%F'格式,它可以讓你小數點後指定的位數。 – Barmar

回答

2
  • \1應該$1。在替換表達式中使用\1是沒有意義的。如警告所示,這樣做是一個錯誤。
  • 它看到$10而非$1。使用捲曲消除歧義(${1}0)。
  • 即使你需要兩個零,也總會增加一個零。

解決方案:

perl -i -pe's/\.\d(\d)?\K/ defined($1) ? "0" : "00" /eg' myFile.txt 
perl -i -pe's/\.(\d{1,2})\K/ "0" x (3 - length($1)) /eg' myFile.txt 
perl -i -pe's/\.\d(?!\d)\K/0/g; s/\.\d\d\K/0/g;' myFile.txt 
+0

謝謝我最終使用了與此相似的東西!完全忘了我可以用$符號代替\ – Marko8119

+0

@Julian Fondren,我知道。我甚至說了很多。你爲什麼提到這個? – ikegami

+0

@ikegami,好吧,那不是一個bug:http://perldoc.perl.org/perlre.html#Warning-on-%5c1-Instead-of-%241 –

2

由於Barmar said in the comment,你可以使用sprintf指定小數位的數量。

perl -p -i -e 's/(\d+\.\d+)/sprintf "%.3f", $1/eg' myFile.txt 

注:

  • %.3f是指具有3個小數位浮點數。
  • e標誌表示將替換端評估爲表達式。
  • 另外請注意,您必須捕捉整個數字(不只是小數點後的數字)才能使其工作。
  • $1是用來代替\1更換上側(參見perldoc note here瞭解這個)。