我的日志文件包含以下内容:
(2947:_dRW00T3WEeSkhZ9pqkt5dQ) ---$ ABC XY "Share" 16-Sep-2014 03:22 PM
(2948:_3nFSwz3TEeSkhZ9pqkt5dQ) ---$ ABC XY "Share" 16-Sep-2014 03:05 PM
(2949:_voeYED3AEeSkhZ9pqkt5dQ) ---$ ABC XY "Initial for Re,oved" 16-Sep-2014 12:44 PM
我想从每一行读取唯一ID id _dRW00T3WEeSkhZ9pqkt5dQ并将其存储在一个数组中。 我目前的代码是:
while(<$fh>) {
if ($_ =~ /\((.*?)\)/) {
push @cs_ids , $1;
}
}
答案 0 :(得分:2)
试试这个:
while(<$fh>) {
if ($_ =~ /\(\d+:(.+?)\)/) {
push @cs_ids , $1;
}
}
正则表达式检查以(
开头的所有字符串,然后检查一个或多个数字是一个双点而不是一个或多个字符(将存储在$1
中)。字符串的结尾是)
。
答案 1 :(得分:0)
你快到了那里:
perl -e '$string = "(2947:_dRW00T3WEeSkhZ9pqkt5dQ)"; if ($string =~ /^\((\d+:)(.*?)\)$/) { die $2; }'
_dRW00T3WEeSkhZ9pqkt5dQ at -e line 1.
将正则表达式条件更改为:
/^\((\d+:)(.*?)\)$/
这样做是匹配并将4位数和冒号分组为特殊的var $ 1和你想要的id为特殊的var $ 2.
答案 2 :(得分:0)
如果日志文件的每一行都保证有一个ID字符串,那么你可以只写
while (<$fh>) {
/:(\w+)/ and push @cs_ids , $1;
}
\w
(“word”)字符类匹配字母数字字符或下划线,这个正则表达式只是阻塞冒号后面的第一个单词字符序列。如果可能的话,最好避免使用非贪婪的修饰符,因为它是一个草率的规范,并且可能比简单的多字符匹配慢得多。