我有像
这样的数据3:12:19 [Sam Peters] user at X
11:1:17 [Roger Fernandes] user at Y
10:9:25 [Harry Dsouza] user at Z
我希望我的输出
[Peters.S] user at X 3:12:19
[Fernandes.R] user at Y 11:1:17
[Dsouza.H] user at Z 10:9:25
我的代码无效。这是我的剧本
#!/usr/bin/perl/
use warnings;
use strict;
my $log = "3:12:19 [Sam Peters] user at X \n11:1:17 [Roger Fernandes] user at Y \n10:9:25 [Harry Dsouza] user at Z \n";
print "$log \n";
$log =~ s/ ^
(.*) #First group time
\s #whitespace
\[ #start bracket
(\w)\s(\w+) #name in square barckets
\] #end brackets
\s
(.*) #everything else
$/\[$3\.$2\] $4 $1/gxi;
print "$log \n";
我只是Perl的初学者。我的输出与输入相同,没有变化。
答案 0 :(得分:1)
(\w)\s(\w+)
永远不会匹配您的“姓名”数据。 (\w)\w+\s(\w+)
有效(前提是没有中间名,缩写,也没有'Jr。'或'III'等结尾。)
您对“时间”字段的捕获有效,但可以更安全地写为(\d\d?:\d\d?:\d\d?)
$/\[$3\.$2\] $4 $1/gxi;
无需转义上面的'[]'括号(替换的替换方中的每个东西都被视为普通的双引号字符串)。此处不需要i
修饰符(字符串中没有大小写项。没有匹配需要标识大写/小写字母)。并且您需要m
修饰符,以便^ and $
在行的开头和结尾匹配(不 字符串的开头和结尾) (您的$log
变量是一个包含3 行的字符串。)
通过这些更改,可能会写入替换表达式:
$log =~ s/^
(\d\d?:\d\d?:\d\d?) # capture 'time' stamp
\s # space
\[ # opening bracket
(\w)\w+\s(\w+) # capture first initial and last name
\] # close bracket
(.+)$ # remaining to end of 'line'
/[$3.$2]$4$1/mgx;
答案 1 :(得分:0)
在简单的代码示例中,您可以读取数据的每一行并在每一行使用此正则表达式:
$line =~ s/(.*) \[(\w)(\w+) (\w+)\] user at (\w+)/\[$4\.$2\] user at $5 $1/;
使用上述数据替换此link上的正则表达式示例。