2013-02-11 14 views
12

मुझे यह हल करें:पावरहेल: स्ट्रिंग्स की एक सरणी द्वारा फ़ाइल की सामग्री फ़िल्टर करें

मेरे पास डेटा की एक टेक्स्ट फ़ाइल है। मैं इसे पढ़ना चाहता हूं, और केवल आउटपुट लाइनें जिनमें कोई भी स्ट्रिंग है जो खोज शब्दों की सरणी में पाई जाती है।

अगर मैं सिर्फ एक स्ट्रिंग देख रहे थे, मैं कुछ इस तरह करना होगा:

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

अब, मैं सिर्फ "TextI'mLookingFor" के लिए की जरूरत तार की एक सरणी, जहां $ अगर _ शामिल होने के लिए सरणी में कोई स्ट्रिंग, यह पाइप को आउट-फाइल में पास कर दिया जाता है।

मैं कैसे करूँ होता है कि (और BTW, मैं एसी # प्रोग्रामर इस powershell स्क्रिप्ट हैकिंग हूँ, इसलिए अगर वहाँ में .Contains(), सुराग मुझे का उपयोग करने से ऊपर मेरी मैच करने के लिए! एक बेहतर तरीका है)

उत्तर

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 विशेष regex-पात्रों पर ध्यान नहीं देता। अगर आप अपने पैटर्न में रेगेक्स चाहते हैं, तो बस इसे हटा दें।

एक भी पैटर्न मैं शायद इस का प्रयोग करेंगे के लिए, लेकिन आप पैटर्न में regex पात्रों से बचने के लिए है:

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

+0

बस एक त्वरित परीक्षण चलाया, और -मैच बड़ी संख्या में प्रतिनिधि के लिए बेहतर काम करता है (चयन-स्ट्रिंग से लगभग 15x तेज)। – mjolinor

+0

regex विविधता +1 के लिए धन्यवाद। मैंने सादगी के कारण चयन-स्ट्रिंग प्रतिक्रिया का जवाब दिया। – JMarsch

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

regex के बिना और रिक्त स्थान के लिए संभव के साथ:

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