如何在perl中使用替换正则表达式进行交换

时间:2017-02-25 20:09:41

标签: regex perl

我有像

这样的数据
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的初学者。我的输出与输入相同,没有变化。

2 个答案:

答案 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上的正则表达式示例。