2013-02-11 66 views
12

謎語:this:Powershell:通過字符串數組篩選文件的內容

我有一個數據文本文件。我想讀入它,並且只輸出包含在搜索項數組中找到的任何字符串的行。

如果我正在尋找只有一個字符串,我會做這樣的事情:

get-content afile | where { $_.Contains("TextI'mLookingFor") } | out-file FilteredContent.txt 

現在,我只需要一個「TextI'mLookingFor」是一個字符串數組,如果$ _包含其中數組中的任何字符串,它將傳遞到管道外部。

我將如何做到這一點(和BTW,我是C#程序員黑客這個PowerShell腳本,所以如果有一個更好的辦法做到我上面的匹配比使用。載有(),給我介紹!)

回答

26

嘗試Select-String。它允許一系列模式。例如:

$p = @("this","is","a test") 
Get-Content '.\New Text Document.txt' | Select-String -Pattern $p -SimpleMatch | Set-Content FilteredContent.txt 

請注意,我用-SimpleMatch使Select-String忽略特殊的正則表達式字符。如果你想在你的模式中使用正則表達式,只需刪除它。

對於單一的模式,我可能會用這個,但你必須在模式逃脫正則表達式的字符:

Get-Content '.\New Text Document.txt' | ? { $_ -match "a test" } 

Select-String是單一的模式也有很大cmdlet時,它不再僅僅是幾個大字寫^^

2

任何幫助嗎?

$a_Search = @(
    "TextI'mLookingFor", 
    "OtherTextI'mLookingFor", 
    "MoreTextI'mLookingFor" 
    ) 


[regex] $a_regex = ‘(‘ + (($a_Search |foreach {[regex]::escape($_)}) –join 「|」) + ‘)’ 

(get-content afile) -match $a_regex 
+0

選擇字符串可能是一個更好的選擇,尤其是對文件數據。 – mjolinor 2013-02-11 23:12:33

+0

剛剛進行了一次快速測試,並且-match對於大量代表更有效(比選擇字符串快大約15倍)。 – mjolinor 2013-02-11 23:26:40

+0

感謝您的正則表達式變化+1。由於簡單性,我給出了選擇字符串響應的答案。 – JMarsch 2013-02-12 14:17:27

1
$a = @("foo","bar","baz") 
findstr ($a -join " ") afile > FilteredContent.txt 
2

沒有正則表達式,並用空格可能:

$array = @("foo", "bar", "hello world") 
get-content afile | where { foreach($item in $array) { $_.contains($item) } } > FilteredContent.txt