我只想从文件中提取数字并将其组织为 CSV。
来自:
Aa:40, Bint:02 : Bstring = 0x13 Ccc Num = 52 Dfloat = 164.0
Aa:40, Bint:03 : Bstring = 0x1B Ccc Num = 10 Dfloat = 10.6
Aa:41, Bint:04 : Bstring = 0x1A Ccc Num = 10 Dfloat = 1.6
到:
40,02,0x13,52,164.0
40,03,0x1B,10,10.6
41,04,0x1A,10,1.6
我可以用 Python re.findall 来做到这一点(如下所示)
for line in sys.stdin:
print (",".join(re.findall(r'\d+.?\w+', line)))
实现相同目标的 perl 方法是什么?
请您参考如下方法:
您正在从字符串中提取数值。
你可以这样做的方法是:
m/(\d+)/g;
当然,因为您还包括 .和 x :
m/(\d[\d\.xA-F]+)/ig;
或者作为一个类轮:
perl -nle 'print join ",", m/(\d[\d\.xA-F]+)/ig;'
n是“将其包装在while ( <> ) {中。这意味着您可以管道
STDIN或在其后指定一个文件 - 例如perl -nle 'print join ",", m/(\d[\d\.xA-F]+)/gi;' somefilecat somefile | perl -nle 'print join ",", m/(\d[\d\.xA-F]+)/gi;'l是自动咀嚼。它chomps换行并在打印后重新添加它们e正在执行此代码段。
这有效地构成了上面的一个衬垫:
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
print join(',', /(\d[\d\.xA-F]+)/gi);
}
这给;
40,02,0x13,52,164.0
40,03,0x1,10,10.6
41,04,0x1,10,1.6
这看起来像您想要的输出。
