Perl one-liner指定小数位

时间:2013-07-02 02:03:53

标签: perl

我正在修改一个大的txt文件。是否有一个单行使用零填充字符串模式?例如,从一个或两个小数位到三位。例如从0.21到0.210或0.5到0.500?我正在尝试的代码:

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

提前感谢您的任何帮助:)

2 个答案:

答案 0 :(得分:2)

  • \1应为$1。在替换表达式中使用\1是没有意义的。如警告所示,这样做是一个错误。
  • 它看到$10而不是$1。使用curlies消除歧义(${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

答案 1 :(得分: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)。