2017-08-10 69 views
-2

我的powershell腳本似乎不能解析跨多行傳播的多個關鍵字之間的數據。 我想選擇NAME1之後的所有行直到NAME2..6出現。所有NAME1/& NAME2/3/4/5/6之間的數據。關鍵字NAME1多次出現在文件中,其他關鍵字也會出現。正則表達式然而工作,但我無法找出錯誤或我正在採取的方法,當我在PowerShell腳本中使用正則表達式。無法使用PowerShell在多個關鍵字之間獲取數據

(Get-Content .\withoutStar.txt | Where-Object {$_ -match '(?is)(?<=\NAME1\b).*?(?=\bNAME2\b|\bNAME3\b|NAME4|NAME5|NAME6\b)'}) | Set-Content .\AllfunctionGroup.txt

的樣品數據和正則表達式可以在這裏進行測試。 Sample data and regex

任何人都可以點亮這在我的腳本中缺少的東西。

+0

我認爲,試圖匹配多個行可能更容易使用像for循環這樣的東西,所以你可以匹配一行,並不斷添加每行或匹配變量,直到你的代碼邏輯告訴它停止。 –

+0

你想看到什麼樣的輸出? – ArcSet

回答

1

與你的腳本的問題是在這裏:

Where-Object {$_ -match '(?is)(?<=\bNAME1\b).*?(?=\bNAME2\b|\bNAME3\b|NAME4|NAME5|NAME6\b)'}
這並不意味着「繼續比賽」,但「如果有匹配,保持整個字符串」。

這裏是另一種方法做你想要什麼:

$text = Get-Content .\withoutStar.txt 
$regex = "(?is)(?<=\bNAME1\b).*?(?=\bNAME[2-6]\b)" 
Set-Content .\AllfunctionGroup.txt -Value "" 
(Select-String -Pattern $regex -Input $text -AllMatches).Matches | ForEach { 
    Add-Content .\AllfunctionGroup.txt $_.Value 
} 

編輯:我簡化了一下你的正則表達式

相關問題