2012-07-05 9 views
50

के साथ कुछ करें, मैं रिक्त स्थान पर पाइप की प्रत्येक पंक्ति को विभाजित करना चाहता हूं, और फिर प्रत्येक टोकन को अपनी लाइन पर प्रिंट करना चाहता हूं।पावरशेल के साथ स्प्लिट स्ट्रिंग और प्रत्येक टोकन

मुझे लगता है कि मैं इस परिणाम का उपयोग कर प्राप्त कर सकते हैं:

(cat someFileInsteadOfAPipe).split(" ") 

लेकिन मैं और अधिक लचीलापन चाहते हैं। मैं बस प्रत्येक टोकन के साथ कुछ भी करने में सक्षम होना चाहता हूँ। (मैं यूनिक्स पर AWK का उपयोग करते थे, और मैं ही कार्यक्षमता प्राप्त करने के लिए कोशिश कर रहा हूँ।)

मैं वर्तमान में है:

echo "Once upon a time there were three little pigs" | %{$data = $_.split(" "); Write-Output "$($data[0]) and whatever I want to output with it"} 

कौन सा, जाहिर है, केवल पहले टोकन प्रिंट करता है। क्या मेरे लिए टोकन पर प्रत्येक के लिए एक रास्ता है, प्रत्येक बदले में प्रिंटिंग?

इसके अलावा, %{$data = $_.split(" "); Write-Output "$($data[0])"} भाग मुझे एक ब्लॉग से मिला, और मैं वास्तव में समझ नहीं पा रहा हूं कि मैं क्या कर रहा हूं या वाक्यविन्यास कैसे काम करता है।

मैं इसके लिए Google चाहता हूं, लेकिन मुझे नहीं पता कि इसे क्या कॉल करना है। कृपया मुझे Google या दो शब्दों के साथ Google में मदद करें, या मुझे बताएं कि % और सभी $ प्रतीकों के साथ-साथ उद्घाटन और समापन ब्रैकेट का महत्व भी है।

मुझे एहसास है कि मैं वास्तव में (cat someFileInsteadOfAPipe).split(" ") का उपयोग नहीं कर सकता, क्योंकि फ़ाइल (या बेहतर आने वाली पाइप) में एक से अधिक पंक्तियां होती हैं।

कुछ उत्तर के बारे में:

आप Select-String उपयोग कर रहे हैं tokenizing से पहले उत्पादन फिल्टर करने के लिए, आप को ध्यान में रखने की जरूरत है कि Select-String आदेश के उत्पादन में तार का एक संग्रह है, लेकिन का एक संग्रह नहीं है MatchInfo वस्तुओं। स्ट्रिंग आप विभाजित करना चाहते हैं पाने के लिए, तुम इतनी तरह MatchInfo वस्तु की Line संपत्ति का उपयोग करने की, जरूरत है:

cat someFile | Select-String "keywordFoo" | %{$_.Line.Split(" ")} 

उत्तर

100
"Once upon a time there were three little pigs".Split(" ") | ForEach { 
    Write-Host "$_ is a token" 
} 

कुंजी $_ है, जो पाइप लाइन में वर्तमान चर के लिए खड़ा है।

कोड आप ऑनलाइन पाया के बारे में:

%ForEach-Object के लिए एक उपनाम है। ब्रैकेट के अंदर संलग्न कुछ भी एक बार प्रत्येक ऑब्जेक्ट के लिए चलाया जाता है। इस मामले में, यह केवल एक बार चल रहा है, क्योंकि आप इसे एक स्ट्रिंग भेज रहे हैं।

$_.Split(" ") वर्तमान चर ले रहा है और इसे रिक्त स्थान पर विभाजित कर रहा है। वर्तमान चर जो भी वर्तमान में ForEach द्वारा लुप्त हो रहा है।

+1

aaaah, संपादन के लिए धन्यवाद। यह जानकर कि '%' 'foreach-object 'के लिए छोटा है, इसका अर्थ है कि मैं इसे कई पंक्तियों के लिए कर सकता हूं:' cat। \ Tmp.txt | % {$ _। विभाजन ("")} | % {लिखें-आउटपुट "$ ($ _) हैलो"} 'समस्या हल हो गई। –

+2

बिल्कुल सही! मैं खुशी से मदद कर सकता है। आपके आदेश का अंतिम भाग वास्तव में सिर्फ $ "हैलो" हो सकता है। यदि आप स्ट्रिंग के अंदर किसी ऑब्जेक्ट की संपत्ति के मान को विस्तारित करने का प्रयास कर रहे हैं तो आपको केवल $ ($ चर) नोटेशन का उपयोग करने की आवश्यकता है। उदाहरण के लिए "मेरा अंतिम नाम $ ($ person.surname) है।" या cmdlet की विधि का आउटपुट: "" कल की तारीख $ ((गेट-डेट) है। एडडेज़ (1)) "'। –

+11

बस एक नोट: PowerShell v2 के रूप में एक '-प्लिट' ऑपरेटर है जिसका उपयोग सामान्य रूप से व्हाइटस्पेस पर विभाजित करने के लिए किया जा सकता है ('-split $ foo') या समान '।विभाजन ('') ':' $ foo -split '' '। – Joey

संबंधित मुद्दे