2015-04-22 25 views
2

我有一個大的日誌文件,我想提取某些類型的行。我創建了一個工作正則表達式來匹配這些行。我現在怎樣才能使用這個正則表達式來提取行,而不是別的?我曾嘗試正則表達式替換文件的內容和刪除不匹配的行

cat .\file | %{ 
    if($_ -match "..."){ 
     $_ -replace "...", '...' 
    } 
    else{ 

     $_ -replace ".*", "" 
    } 
} 

幾乎工作,但那些不感興趣的行仍然爲空行(指感興趣的線相隔很遠VERY)。

回答

3

最好的方法是完全刪除else子句。如果你這樣做,那麼ForEach-Object塊的迭代中不會返回任何對象。

cat .\file | %{ 
    if($_ -match "..."){ 
     $_ -replace "...", '...' 
    } 
} 
+0

每行沒有正則表達式運行一次的目標是什麼?如果我添加「s」標誌,我認爲這不會有幫助?無論哪種方式,我喜歡不修改正則表達式的解決方案 –

+0

是的,其實你是對的。即將編輯。 – briantist

+0

這次我真的測試過它! – briantist

1

只要追加到briantist's answer你甚至不需要循環結構。 -match-replace將作爲數組運算符。取消對ifForEach-Object的需求。

(Get-Content .\file) -match "..." -replace "...","..." 

Get-Content是別名cat

+0

非常好,+1! @David Grinberg,Powershell有很多這樣的事情,他們真的派上用場。請注意,它們中的一些是在Powershell 3中添加的(例如在包含Thing屬性的對象數組上使用'.Thing',以返回一組東西),所以還要注意您正在編寫哪個版本。 – briantist

相關問題