我被這種情況困住了,我有這個正則運算式
*為清楚起見,此處添加了輸入:
181221533;MG;3;1476729;<vars> <vint> <name>mtest</name> <storedPrecedure>f_sc_mtest</SP> <base>M_data</base> <dataType>I</dataType> <timeMS>17</timeMS> <ttidr>abc</ttidr> <base>S</base> <valor>0</valor> </vint> </vars>;889;6;85;112;01/01/2019;29/05/2019 17:17:48
182652972;MG;6314429;740484;<vars> <vint> <name>mtest</name> <sP>f_sc_mtest</sP> <base>sscy</base> <dataType>I</dataType> <timeMS>16</timeMS> <ttidr>abc</Idtype> <base>S</base> <valor>4</valor> </vint></vars>;-1;8;57217;57228;01/01/2019;06/06/2019 22:20:48
182652984;ModeloSP;6314429;740484;<vars> <vint> <name>tc_p_act</name> <sP>rndom_name</sP> <base>sscyo</base> <dataType>I</dataType> <timeMS>0</timeMS> <Idtype>XYZ</Idtype> <base>O</base> </vint>
</vars>;0;;0;41;01/01/2019;06/06/2019 22:31:22
182652988;ModeloSP;6314429;740484;<vars> <vint> <name>tc_p_act</name> <sP>rndom_name</sP> <base>sscyo</base> <dataType>I</dataType> <timeProcess>1</timeProcess> <Idtype>XYZ</Idtype> <base>O</base> </vint>
</vars>;0;;0;85;01/01/2019;06/06/2019 22:37:36
我想用多行支持在 perl 中實作這個正則運算式,因為正如您在示例中看到的那樣,記錄中有換行符,這個正則運算式搜索“不完整”行(和額外的行)并修復它們(一個記錄/行應該以日期時間結束)
這就是我用 perl 嘗試的:
perl.exe -0777 -i -pe "s/(?m)^(.*)(>)([\n] )(<)(.*)([\n] )(\s*)$/$1$2 $4$5/igs" "sample.txt"
而且似乎不起作用,我一直得到相同的文本檔案。我在便攜式 GIT 安裝(v5.34.0)中使用 perl
有什么我想念的嗎?
編輯:這是輸出的樣子:
181221533;MG;3;1476729;<vars> <vint> <name>mtest</name> <storedPrecedure>f_sc_mtest</SP> <base>M_data</base> <dataType>I</dataType> <timeMS>17</timeMS> <ttidr>abc</ttidr> <base>S</base> <valor>0</valor> </vint> </vars>;889;6;85;112;01/01/2019;29/05/2019 17:17:48
182652972;MG;6314429;740484;<vars> <vint> <name>mtest</name> <sP>f_sc_mtest</sP> <base>sscy</base> <dataType>I</dataType> <timeMS>16</timeMS> <ttidr>abc</Idtype> <base>S</base> <valor>4</valor> </vint></vars>;-1;8;57217;57228;01/01/2019;06/06/2019 22:20:48
182652984;ModeloSP;6314429;740484;<vars> <vint> <name>tc_p_act</name> <sP>rndom_name</sP> <base>sscyo</base> <dataType>I</dataType> <timeMS>0</timeMS> <Idtype>XYZ</Idtype> <base>O</base> </vint> </vars>;0;;0;41;01/01/2019;06/06/2019 22:31:22
182652988;ModeloSP;6314429;740484;<vars> <vint> <name>tc_p_act</name> <sP>rndom_name</sP> <base>sscyo</base> <dataType>I</dataType> <timeProcess>1</timeProcess> <Idtype>XYZ</Idtype> <base>O</base> </vint> </vars>;0;;0;85;01/01/2019;06/06/2019 22:37:36
uj5u.com熱心網友回復:
捕獲整個記錄并用空格替換其中的所有換行符,使用替換部分內的另一個正則運算式(由/e修飾符提供)。然后用一個替換所有多個換行符
perl.exe -0777 -wpe'
s{ (?:^|\R)\K (\d{9}; .*? \s \d\d:\d\d:\d\d) }{$1 =~ s/\n / /r}segx; s{\n }{\n}g
' file.txt
我認為“記錄”是:[0-9]{9};在行/檔案開頭,然后全部包含空格后的時間戳。記錄開頭和結尾的詳細資訊應防止意外匹配這些標簽內可能出現的意外模式。
這很麻煩,但我希望它能夠正確捕獲記錄,即使某些細節發生了變化。
顯然,上述方法在 Windows 上失敗了,而它被證實可以在 Linux 上作業(我現在唯一可以嘗試的系統)。
問題必須在換行符中 - 所以嘗試用or替換\n匹配項。特別是在替換部分中嵌入的正則運算式中。或者,為了安全和便攜,替換為(所以回車符是可選的,不需要在那里)\R\r\n\n(\r?\n)
所以要么
s{ (?:^|\R)\K (\d{9}; .*? \s \d\d:\d\d:\d\d) }{$1 =~ s/\R / /r}segx; s{\R }{\r\n}g
或者
s{ (?:^|\R)\K(\d{9};.*?\s \d\d:\d\d:\d\d) }{$1 =~ s/(\r\n) / /r}segx; s{(\r\n) }{\r\n}g
但\R應該在 Windows 上匹配它,因此您應該能夠在需要時\R用于匹配和\r\n替換。在 perlbackslash 中的 Misc下查看
更好的是,如果可行的話,是使用PerlO 層。通常情況下,Perl 的 Windows 構建會默認添加 `:crlf: 層,但顯然這里不是這種情況。
在單線嘗試中:
perl.exe -0777 -Mopen=:std,IO,:crlf -wpe'...'
或者,使用“單線”作為普通程式,沒有檔案處理開關,并通過open pragma設定 并手動打開檔案
perl -wE'use open IO => ":crlf"; $_ = do { local $/; <> }; s{...}{...}; say' file
對于像這樣設定的圖層(無論哪種方式),請使用帶有\n.
uj5u.com熱心網友回復:
這似乎產生了想要的輸出:
perl.exe -0777 -pe "s: *\n(?=</): :g;s/\n /\n/g"
</第一個替換用四個空格替換空格,然后是換行符。- 第二個替換用一個替換多個換行符。您也可以將其替換為音譯:
tr/\n//s,/s“擠壓”換行符。
uj5u.com熱心網友回復:
如果問題是換行符出現在錯誤的位置,或者一行中有多個換行符,或者在 a 之前<,您可能會遇到這樣簡單的事情:
use strict;
use warnings;
my $str = do { local $/; <DATA> };
$str =~ s/\n(?=[<\n])//g;
print $str;
__DATA__
181221533;<valor>0</valor></vars>;889;6;85;112;01/01/2019;29/05/2019 17:17:48
182652972;</vars>;-1;8;57217;57228;01/01/2019;06/06/2019 22:20:48
182652984;</vint>
</vars>;0;;0;41;01/01/2019;06/06/2019 22:31:22
182652988; </vint>
</vars>;0;;0;85;01/01/2019;06/06/2019 22:37:36
(我縮短了輸入以使其可讀)
輸出:
181221533;<valor>0</valor></vars>;889;6;85;112;01/01/2019;29/05/2019 17:17:48
182652972;</vars>;-1;8;57217;57228;01/01/2019;06/06/2019 22:20:48
182652984;</vint></vars>;0;;0;41;01/01/2019;06/06/2019 22:31:22
182652988; </vint></vars>;0;;0;85;01/01/2019;06/06/2019 22:37:36
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/422445.html
標籤:
上一篇:正則運算式:查找和替換
