找到零值并用空格替换/删除它们 - Perl

时间:2015-08-09 11:56:24

标签: regex perl

我有一个以制表符分隔的列式.txt文件,格式为:

61200   285700  22000
61600   294000  22300
64400   385200  22500
66100   427600  24000
70700   478500  24400
72300   0       24700
72700   0       24800
78600   0       25200
79900   0       25300
83600   0       26100
84700   0       26300
86900   0       26600
88300   0       27000
91000   0       27200
91900   0       27400
92700   0       27500

我想找到所有“0”值(不包括尾随零)并删除它们,或用空格替换它们。

期望的输出:

61200   285700  22000
61600   294000  22300
64400   385200  22500
66100   427600  24000
70700   478500  24400
72300           24700
72700           24800
78600           25200
79900           25300
83600           26100
84700           26300
86900           26600
88300           27000
91000           27200
91900           27400
92700           27500

这种可以扩展的最有效方法是什么?我将批量处理大量的.txt文件 - 每个文件都是> 50Mb。

3 个答案:

答案 0 :(得分:4)

简单,在\b之前和之后使用字边界0\b匹配单词字符和非单词字符(反之亦然)。

perl -pe 's/\b0\b/ /g' file

添加-i参数以进行就地编辑。

perl -i -pe 's/\b0\b/ /g' file

答案 1 :(得分:1)

你可以使用这样的正则表达式:

/^(\d+)\t+((0)|(\d+))\t+(\d+)$/gm

并使用它的替换:

\1\t\4\t\5

[Regex Demo]

答案 2 :(得分:1)

如果您有一个庞大的文件列表要批处理,这样会更有效:

perl -pe 's/\t0\t/\t \t/' blah

我认为因为perl正在寻找所有的边界字符,而不仅仅是标签。

marshall@marshall-desktop:~$ ls -lh blah && time perl -pe 's/\b0\b/ /' blah >/dev/null && time perl -pe 's/\t0\t/\t \t/' blah >/dev/null
-rw-r--r-- 1 marshall marshall 53M Aug  9 22:03 blah

real    0m4.077s
user    0m4.048s
sys 0m0.028s

real    0m2.765s
user    0m2.752s
sys 0m0.012s