2009-12-09 22 views
17

में टेक्स्ट फ़ाइल में सामग्री डालें मैं पावरहेल में एक टेक्स्ट फ़ाइल के बीच में सामग्री जोड़ना चाहता हूं। मैं एक विशिष्ट पैटर्न खोज रहा हूं, फिर उसके बाद सामग्री जोड़ रहा हूं। ध्यान दें कि यह फ़ाइल के बीच में है।पावरहेल

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

(Get-Content ($fileName)) | 
     Foreach-Object { 
      if($_ -match "pattern") 
      { 
       #Add Lines after the selected pattern 
       $_ += "`nText To Add" 
      } 
     } 
    } | Set-Content($fileName) 

बहरहाल, यह काम नहीं करता। मुझे लगता है क्योंकि $ _ अपरिवर्तनीय है, या क्योंकि + = ऑपरेटर इसे सही तरीके से संशोधित नहीं करता है?

टेक्स्ट को $ _ में जोड़ने का तरीका क्या है जो निम्नलिखित सेट-सामग्री कॉल में दिखाई देगा?

+1

आपके मूल के साथ एकमात्र समस्या यह है कि आपने कुछ भी आउटपुट नहीं किया है। अगर() {} ब्लॉक के बाद बस $ _ संलग्न करें ... – Jaykul

उत्तर

29

बस अतिरिक्त टेक्स्ट उदा।

(Get-Content $fileName) | 
    Foreach-Object { 
     $_ # send the current line to output 
     if ($_ -match "pattern") 
     { 
      #Add Lines after the selected pattern 
      "Text To Add" 
     } 
    } | Set-Content $fileName 

आपको अतिरिक्त `` n` की आवश्यकता नहीं हो सकती है क्योंकि PowerShell आपके लिए प्रत्येक स्ट्रिंग को समाप्त कर देगा।

10

कैसे इस बारे में:

(gc $fileName) -replace "pattern", "$&`nText To Add" | sc $fileName 

मुझे लगता है कि काफी सीधी-सपाट है। एकमात्र गैर-स्पष्ट बात "$ &" है, जो कि "पैटर्न" से मेल खाने वाली चीज़ों को संदर्भित करती है। अधिक जानकारी: http://www.regular-expressions.info/powershell.html

+0

अच्छा सुझाव। मुझे जो करना है उसके लिए काम नहीं करता है लेकिन एक सामान्य मामले में काम करेगा। – Jeff

+0

@ जेफ, मेरा मानना ​​है कि यह आपके कामकाज के बराबर है। –

1

इस समस्या को सरणी का उपयोग करके हल किया जा सकता है। एक पाठ फ़ाइल तारों की एक सरणी है। प्रत्येक तत्व पाठ की एक पंक्ति है।

$FileName = "C:\temp\test.txt" 
$Patern = "<patern>" # the 2 lines will be added just after this pattern 
$FileOriginal = Get-Content $FileName 

<# create empty Array and use it as a modified file... #> 

[String[]] $FileModified = @() 

Foreach ($Line in $FileOriginal) 
{  
    $FileModified += $Line 

    if ($Line -match $patern) 
    { 
     #Add Lines after the selected pattern 
     $FileModified += "add text' 
     $FileModified += 'add second line text' 
    } 
} 
Set-Content $fileName $FileModified