2013-04-27 8 views
22

में एक regex के साथ एक textfile की सामग्री बदलें मैं एक सरल textfile है और मैं एक powershell स्क्रिप्ट की जरूरत है फ़ाइल सामग्री के कुछ हिस्सों को बदलने के लिए।powershell

$content = Get-Content -path "Input.json" 

$content -Replace '"(\d+),(\d{1,})"', '$1.$2' | Out-File "output.json" 

क्या यह संभव है सामग्री चर के बिना एक पंक्ति में यह लिखने के लिए, इस तरह:

मेरे वर्तमान स्क्रिप्ट निम्नलिखित है?

Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' | Out-File "output.json" 

मैं नहीं जानता कि मैं कैसे $ सामग्री चर के बिना दूसरा आदेश में पहली मिल-सामग्री commandlet के उत्पादन में उपयोग कर सकते हैं? वहाँ एक स्वचालित powershell चर

यह है एक पाइप लाइन में एक से अधिक प्रतिस्थापन करने के लिए संभव है।

Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' | ??? -Replace 'second regex', 'second replacement' | Out-File "output.json" 

उत्तर

37

हाँ, आप कर सकते हैं कि एक पंक्ति में और इस तरह आप यह करने के लिए उम्मीद करेंगे भी, एक पाइप लाइन की जरूरत नहीं है सरणियों पर -replace काम करता है के रूप में (और आप ऑपरेटर श्रृंखला कर सकते हैं):

(Get-Content Input.json) ` 
    -replace '"(\d+),(\d{1,})"', '$1.$2' ` 
    -replace 'second regex', 'second replacement' | 
    Out-File output.json 

(लाइन ब्रेक पठनीयता के लिए जोड़ा गया है।)

Get-Content कॉल के आसपास कोष्ठक -replace ऑपरेटर को रोकने के लिए आवश्यक हैं Get-Content लिए एक तर्क के रूप में व्याख्या की जा रही है।

+0

धन्यवाद! मैं यही चाहता था! –

+0

हालांकि यह केवल एक-पंक्ति-पर-एक-समय '"\' n "," b "-replace (' \ n ',' a ') पर काम करता है,' '' ',' b 'वापस आ जाएगा। '" \ 'n", "b" -replace ('\ nb', 'a') 'अभी भी वापस आ जाएगा "\ n n", "बी" –

+1

@TheRedPea: आप इसे एक साथ उपयोग करके सभी लाइनों के साथ कर सकते हैं इसके बजाय 'गेट-कंटेंट-राउ'। फिर आप एक स्ट्रिंग वापस प्राप्त करते हैं। – Joey

4

यह सामग्री चर के बिना एक पंक्ति में यह लिखने के लिए इस तरह संभव है?

हाँ: पाइप लाइन पर वस्तु को संदर्भित करने के ForEach-Object (या इसके उर्फ ​​%) और फिर $_ का उपयोग करें:

Get-Content -path "Input.json" | % { $_ -Replace '"(\d+),(\d{1,})"', '$1.$2' } | Out-File "output.json" 

यह एक पाइप लाइन में एक से अधिक प्रतिस्थापन करने के लिए संभव है।

हां।

  1. उपरोक्त के रूप में: बस Foreach-Object सेगमेंट जोड़ना।
  2. -replace के रूप में रिटर्न परिणाम, वे एक ही अभिव्यक्ति में श्रृंखलित जा सकता है:

    ($_ -replace $a,$b) -replace $c,$d 
    

    मुझे लगता है कोष्ठकों की जरूरत नहीं कर रहे हैं, लेकिन मैं वे इसे पढ़ने में आसान बनाने लगता है: कुछ की तुलना में स्पष्ट रूप से अधिक श्रृंखलित ऑपरेटरों (विशेष रूप से अगर मैच/प्रतिस्थापन गैर तुच्छ हैं) नहीं स्पष्ट हो जाएगा।

+0

आपका समाधान केवल प्राप्त करें-सामग्री आदेश देना चारों ओर कोष्ठकों के साथ काम करता है। (Get-content -path $ inputFile) | % {$ _ -Replace "(\ d +), (\ घ {1,})" ',' $ 1 $ 2 '-Replace "(\ d +)"', '$ 1' -Replace '_', ' '} | बाहर फ़ाइल $ outputfile –

+2

@JanBaer उन कोष्ठकों केवल जरूरत है और यदि '$ InputFile' के रूप में' $ OutputFile' में ही है। – Richard

+0

क्या आपके पास कोई संदर्भ है कि क्यों ब्रांड्स इनपुट फ़ाइल को लिखने के लिए संभव बनाता है?यह वास्तव में उपयोग की जाने वाली समस्या का मामला था, लेकिन मुझे यह स्पष्ट नहीं लगता है। –