2017-02-25 45 views
0

使用正則表達式替換我喜歡如何掉在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的初學者。我得到的輸出與輸入相同,沒有變化。

+0

而是改變你原來的正則表達式,它會一直好,只是編輯您的帖子顯示您做出的改變(你的第二次嘗試)一套全新的代碼。 –

+0

好的。將遵循。 –

回答

0

在簡單的代碼示例,您可以讀取數據的每一行,並使用這個表達式在每一行:這個link上述數據

$line =~ s/(.*) \[(\w)(\w+) (\w+)\] user at (\w+)/\[$4\.$2\] user at $5 $1/; 

替代正則表達式的例子。

+0

你能否請我也糾正我最新的錯誤在我的代碼中,將我更好地學習 –

+0

@Chris已經給出了相當不錯的分析修改你的代碼。 – AbhiNickz

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; 
+0

謝謝...這是有幫助的 –