2017-07-03 35 views
0

輸入文件內容位於底部。該圖像顯示更好的文件格式。在PowerShell中的IF語句中使用正則表達式匹配的問題

正如您從我的輸入文件中看到的,它帶有許多我不需要的行,所以我試圖告訴Powershell在行匹配此模式時讀取內容(請參見下文)。但它返回False,而不是做我喜歡的,它是複製正則表達式和指示塊結束位置的 - 符號之間的所有內容。

任何想法我做錯了什麼? enter image description here

$InputFile = gc "D:\input_file.txt" 
$Dest = "D:\Desktop\Final_file.txt" 

#PATTERN I´M LOOKING FOR: 
0000 00XKDPMBBRAXXX00000 
1965 81PWSLKDTRUGXX00000 

#REGEX I´VE CREATED BASED ON ABOVE CONTENT 
$re = [regex]'(\d{4}\s\d{2}\[a-z]{12}\d{5})' 

$file_line_num = 0 
$mesg_line_num = 0 
$Dest_count  = 0 

foreach ($line in $Input_File) { 
    $file_line_num = $file_line_num + 1 

    # Find where message starts, any other lines are ignored 
    if ($line -match $re) { 

    [void]$foreach.MoveNext() # skip lines not needed 

    $msg_line_num = 0 

    do { 
     [void]$foreach.MoveNext()  
     $line = $foreach.current 
     $msg_line_num = $msg_line_num + 1 

     if ($msg_line_num -lt 3) { 

      $header = $line.substring(7,8) + $line.substring(16, 3) 
      add-content $Dest $header 

     } else { 
      add-content $Dest $line 
     } 

    } until ($line -eq "-" -or $line -eq $null) 
    } 
} 
Exit 

text 
---------------------------------------------------------------------------------------------------- 
---------------------------------------------------------------------------------------------------- 
------------------------------------------------------------------------------------------------ 
TEXTHERE TEXTHERE TEXTHERE 
TEXTHERE 
.TEXTHERE TEXTHERE TEXTHERE 
TEXTHERE TEXTHERE 
0000 00XKDPMBBRAXXX00000 
1965 81PWSLKDTRUGXX00000 
123 99 
TEXTHERE 
TEXTHERE//TEXTHERE 
TEXTHERE 
TEXTHERE 
TEXTHERE 
TEXTHERE//TEXTHERE 
TEXTHERE//TEXTHERE 
TEXTHERE TEXTHERE 
TEXTHERE TEXTHERE 
TEXTHERE TEXTHERE 
- 
=TEXTHERE TEXTHERE 
=TEXTHERE TEXTHERE 



NNNN++++++++++++++++++++++++++++++++++++ 
+          + 
+  -- =TEXTHERE TEXTHERE   + 
+  =TEXTHERE TEXTHERE    + 
+          + 
++++++++++++++++++++++++++++++++++++++++ 

TEXTHERE TEXTHERE TEXTHERE 
TEXTHERE 
.TEXTHERE TEXTHERE TEXTHERE 
TEXTHERE TEXTHERE 
0000 00XKDPMBBRAXXX00000 
1965 81PWSLKDTRUGXX00000 
123 99 
TEXTHERE 
TEXTHERE//TEXTHERE 
TEXTHERE 
TEXTHERE 
TEXTHERE 
TEXTHERE//TEXTHERE 
TEXTHERE//TEXTHERE 
TEXTHERE TEXTHERE 
TEXTHERE TEXTHERE 
TEXTHERE TEXTHERE 
- 
=TEXTHERE TEXTHERE 
=TEXTHERE TEXTHERE 



NNNN++++++++++++++++++++++++++++++++++++ 
+          + 
+  -- =TEXTHERE TEXTHERE   + 
+  =TEXTHERE TEXTHERE    + 
+          + 
++++++++++++++++++++++++++++++++++++++++ 
+0

也從代碼既不是來自文本,我可以看到所需的輸出應該是什麼樣子,只過濾匹配模式到輸出文件中的行? – LotPings

+0

感謝您的編輯,不知道該怎麼做。輸出應顯示從正則表達式模式開始的內容,直到找到文件內所有內容塊的 - (短劃線)符號。 – DevHawk

+0

評論僅供參考。編輯您的問題以包含附加信息。如你所見,這是難以辨認的。你的問題沒有告訴任何關於更多信息的事情。 – LotPings

回答

3

\[a-z]應該是[A-Z] - 不需要斜槓,因爲它產生字面[,也[regex]類是區分大小寫不同於通常-match操作。

無論如何,它可以縮短代碼(PowerShell的3.0和更高版本):

$all = ([regex]'(?s)(?<=(\d{4}\s\d{2}[a-zA-Z]{12}\d{5}\r?\n){2})(.*?)(?=\r?\n-\r?\n)'). 
    Matches((Get-Content source.txt -raw)).Value 

或者PowerShell 2.0中:

$all = ([regex]'(?s)(?<=(\d{4}\s\d{2}[a-zA-Z]{12}\d{5}\r?\n){2})(.*?)(?=\r?\n-\r?\n)'). 
    Matches([IO.File]::ReadAllText('r:\source.txt')) | Select -expand Value 

要複製包括邊界線也改變組的正則表達式:

'(?s)(?:\d{4}\s\d{2}[a-zA-Z]{12}\d{5}\r?\n){2}.*?\r?\n-\r?\n'

+0

我的版本是4.0,所以我嘗試了第一種方法,但它抑制了正則表達式模式和 - 在輸出中。我的輸出願望是包括正則表達式模式,直到找到破折號 - (表示塊的結尾),然後繼續查找下一個正則表達式模式,直到 - – DevHawk

+0

您的問題指出「複製正則表達式和 - 符號,這就是答案。無論如何,修改正則表達式以滿足您的需求是微不足道的,我在答案中添加了一個示例,因爲這裏的註釋會破壞代碼的副本。 – wOxxOm

+0

是的,你說得對,我很抱歉沒有那麼清楚。我必須花更多的時間學習正則表達式,你有什麼好的地方可以學習和練習嗎? – DevHawk

0
> select-string .\input_file.txt -Pattern '(\d{4})\s(\d{2}[a-z]{12}\d{5})' 

input_file.txt:8:0000 00XKDPMBBRAXXX00000 
input_file.txt:9:1965 81PWSLKDTRUGXX00000 
input_file.txt:38:0000 00XKDPMBBRAXXX00000 
input_file.txt:39:1965 81PWSLKDTRUGXX00000 

> select-string .\input_file.txt -Pattern '(\d{4})\s(\d{2}[a-z]{12}\d{5})'|%{$_.matches.captures.value} 
0000 00XKDPMBBRAXXX00000 
1965 81PWSLKDTRUGXX00000 
0000 00XKDPMBBRAXXX00000 
1965 81PWSLKDTRUGXX00000 

> select-string .\input_file.txt -Pattern '(\d{4})\s(\d{2}[a-z]{12}\d{5})'|%{$_.matches.groups[1,2].value} 
0000 
00XKDPMBBRAXXX00000 
1965 
81PWSLKDTRUGXX00000 
0000 
00XKDPMBBRAXXX00000 
1965 
81PWSLKDTRUGXX00000 
+0

謝謝@LotPings,我會嘗試使用第二個示例來抓取模式,並想出其他的東西來填充文本塊內容,直到找到 - 符號。 – DevHawk