[英]How to swap using substitution regex in 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的初學者,我得到的輸出與輸入相同,沒有變化。
(\\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;
在簡單的代碼示例中,您可以讀取數據的每一行,並在每一行上使用此正則表達式:
$line =~ s/(.*) \[(\w)(\w+) (\w+)\] user at (\w+)/\[$4\.$2\] user at $5 $1/;
用上面的數據在此鏈接上替換正則表達式示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.