我想从文件的每一行中提取一些元素。 以下是该行:
# 1150 Reading location 09ef38 data = 00b5eda4
我想从此行提取地址 09ef38 和数据 00b5eda4 。
我使用的方式很简单,如下所示:
while($line = < INFILE >) {
if ($line =~ /\#\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*=\s*(\S+)/) {
$time = $1;
$address = $4;
$data = $6;
printf(OUTFILE "%s,%s,%s \n",$time,$address,$data);
}
}
我想知道有更好的想法吗?更简单,更清洁?
非常感谢!
TCGG
答案 0 :(得分:2)
您可以在LHS上使用匹配和列表,如下所示:
echo '# 1150 Reading location 09ef38 data = 00b5eda4' |
perl -ne '
$,="\n";
($time, $addr, $data) = /#\s+(\w+).*?location\s+(\w+).*?data\s*=\s*(\w+)/;
print $time, $addr, $data'
输出:
1150
09ef38
00b5eda4
答案 1 :(得分:2)
另一个选择是split空格上的字符串:
my ($time, $addr, $data) = (split / +/, $line)[1, 4, 7];
答案 2 :(得分:0)
在python中,适当的正则表达式将是:
'[0-9]+[a-zA-Z ]*([0-9]+[a-z]+[0-9]+)[a-zA-Z ]*= ([0-9a-zA-Z]+)'
但我不确切知道如何在perl中编写它。你可以搜索它。如果您需要对此正则表达式进行任何解释,我可以使用更精确的描述编辑此帖子。
答案 3 :(得分:0)
我发现使用\s+
分割一个或多个任何类型的空格很方便。这样,如果输入字符串中包含任何制表符而不是空格,则不会有任何问题。
while($line = <INFILE>)
{
my ($time, $addr, $data) = (split /\s+/, $line)[1, 4, 7];
}
当按任何类型的空格分割时,重要的是要注意它也会在最后用换行符分割,所以你会在返回结束时得到一个空元素。但在大多数情况下,除非您关心返回的元素总量,否则无需关心。