簡體   English   中英

如何在Perl中使用替換正則表達式進行交換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM