perl - 在perl中用空格替换非数字字符的更简单方法是什么?
问题描述
我有类似以下行的字符串:
2020/07/02 03:15:00 CAT 14,3 km/h OK 95,87 ° OK 14,1 °C OK 75,83 % RH OK 894,4 mbar OK * mm MISSING * °C MISSING * °C MISSING 9,9 °C OK 0,0 W/m² OK
我想替换所有非数字字符,并且只保留用空格分隔的数字。上面的数据线应该是:
2020 07 02 03:15 14.3 95.87 14.1 75.83 894.4 -99. -99. 9.9 0.0
我已经尝试过像下面的 MWE 中的替代品。代码运行没有任何错误,但没有被替换。我还附加了 perl 代码从文件中读取的数据。我的问题有两个:
- 为什么没有更换?
- 如何编写替换正则表达式?
我会很感激帮助
#!/usr/bin/perl -w
use strict;
use warnings;
my $IN=IO::File->new("textstr.txt", q{<}) or die "open 'textstr.txt': failed $! ($^E)";
my @textstr=<$IN>;
foreach my $textstr(@textstr){
chomp $textstr;
$textstr=~ s/\/\:\°\%//g; #replace all these characters by space
$textstr=~ s/km\/h//g;
$textstr=~ s/W\/m\^²//g;
$textstr=~ s/\*/-99.0/g; #replace * by -99. as missing value
$textstr=~ s/\,/\./g; #replace , as decimal point
$textstr=~ s/a-z||A-Z//g;
print "$textstr\n";
}
我无法附加数据,所以我将其附加在下面
2020/07/02 07:00:00 CAT 9,3 km/h OK 129,41 ° OK 9,2 °C OK 98,24 % RH OK 895,9 mbar OK * mm MISSING * °C MISSING * °C MISSING 8,9 °C OK 0,5 W/m² OK
2020/07/02 07:15:00 CAT 8,2 km/h OK 116,25 ° OK 10,5 °C OK 94,73 % RH OK 896,3 mbar OK * mm MISSING * °C MISSING * °C MISSING 9,7 °C OK 79,0 W/m² OK
2020/07/02 07:30:00 CAT 8,2 km/h OK 116,25 ° OK 10,5 °C OK 94,73 % RH OK 896,3 mbar OK * mm MISSING * °C MISSING * °C MISSING 9,7 °C OK 79,0 W/m² OK
2020/07/02 07:45:00 CAT 8,2 km/h OK 116,25 ° OK 10,5 °C OK 94,73 % RH OK 896,3 mbar OK * mm MISSING * °C MISSING * °C MISSING 9,7 °C OK 79,0 W/m² OK
2020/07/02 08:00:00 CAT 8,2 km/h OK 116,25 ° OK 10,5 °C OK 94,73 % RH OK 896,3 mbar OK * mm MISSING * °C MISSING * °C MISSING 9,7 °C OK 79,0 W/m² OK
2020/07/02 08:15:00 CAT 16,2 km/h OK 96,76 ° OK 15,4 °C OK 72,39 % RH OK 896,8 mbar OK 0,0 mm OK 8,7 °C OK 27,1 °C OK 10,5 °C OK 275,0 W/m² OK
2020/07/02 08:30:00 CAT 16,2 km/h OK 96,76 ° OK 15,4 °C OK 72,39 % RH OK 896,8 mbar OK 0,0 mm OK 8,7 °C OK 27,1 °C OK 10,5 °C OK 275,0 W/m² OK
2020/07/02 08:45:00 CAT 16,2 km/h OK 96,76 ° OK 15,4 °C OK 72,39 % RH OK 896,8 mbar OK 0,0 mm OK 8,7 °C OK 27,1 °C OK 10,5 °C OK 275,0 W/m² OK
2020/07/02 09:00:00 CAT 16,2 km/h OK 96,76 ° OK 15,4 °C OK 72,39 % RH OK 896,8 mbar OK 0,0 mm OK 8,7 °C OK 27,1 °C OK 10,5 °C OK 275,0 W/m² OK
解决方案
您需要为/:°%
and使用字符类a-z
:
foreach my $textstr(@textstr){
chomp $textstr;
$textstr=~ s/[\/:°%]/ /g; #replace all these characters by space
$textstr=~ s/km\/h//g;
$textstr=~ s/W.*//;
$textstr=~ s/\*/-99.0/g; #replace * by -99. as missing value
$textstr=~ s/,/./g; #replace , as decimal point
$textstr=~ s/[a-z]//gi;
print "$textstr\n";
}
对于/:°%
,您还需要在替换中添加一个空格。
对于a-z
,您可以使用不区分大小写的修饰符 进行简化i
。
我采取了极端措施来摆脱讨厌的上标²
。您可能想查看那个。
我还消除了一些不必要的反斜杠。
这可以让你大部分时间到达那里。它用空格替换所有冒号,但您的输出保留第一个冒号并删除第二个冒号后的 2 位数字。
推荐阅读
- jquery - 在使用 POSTMAN 时,AJAX POST 请求不起作用
- rust - 函数输出类型随输入变化
- python - 如何在 csv python 中交换行/列
- android - 使用 Delphi 在 Android 服务中显示表单
- javascript - setInterval 作为计数器不适用于赛普拉斯
- jwt - Symfony 5.3:使用 JWT 将用户分配给对象
- javascript - 无限滚动工作但没有做应有的事情
- emscripten - 从 Emscripten 获取 HTML5 设备运动和振动
- python - 在 Python 中计算共现矩阵的任何替代方法?
- html - Mat Select 多组选定值