PowerShell का उपयोग कर फ़ाइल में एकाधिक स्ट्रिंग्स को कैसे बदलें




replace (4)

PowerShell के संस्करण 3 के साथ आप प्रतिस्थापित कॉल को एक साथ जोड़ सकते हैं:

 (Get-Content $sourceFile) | ForEach-Object {
    $_.replace('something1', 'something1').replace('somethingElse1', 'somethingElse2')
 } | Set-Content $destinationFile

मैं कॉन्फ़िगरेशन फ़ाइल को अनुकूलित करने के लिए एक स्क्रिप्ट लिख रहा हूं। मैं इस फ़ाइल के भीतर स्ट्रिंग के कई उदाहरणों को प्रतिस्थापित करना चाहता हूं, और मैंने नौकरी करने के लिए पावरशेल का उपयोग करने का प्रयास किया।

यह एक ही प्रतिस्थापन के लिए ठीक काम करता है, लेकिन एकाधिक प्रतिस्थापन करना बहुत धीमा है क्योंकि हर बार इसे पूरी फ़ाइल को दोबारा पार्स करना पड़ता है, और यह फ़ाइल बहुत बड़ी है। लिपि इस तरह दिखती है:

$original_file = 'path\filename.abc'
$destination_file =  'path\filename.abc.new'
(Get-Content $original_file) | Foreach-Object {
    $_ -replace 'something1', 'something1new'
    } | Set-Content $destination_file

मुझे ऐसा कुछ चाहिए, लेकिन मुझे नहीं पता कि इसे कैसे लिखना है:

$original_file = 'path\filename.abc'
$destination_file =  'path\filename.abc.new'
(Get-Content $original_file) | Foreach-Object {
    $_ -replace 'something1', 'something1aa'
    $_ -replace 'something2', 'something2bb'
    $_ -replace 'something3', 'something3cc'
    $_ -replace 'something4', 'something4dd'
    $_ -replace 'something5', 'something5dsf'
    $_ -replace 'something6', 'something6dfsfds'
    } | Set-Content $destination_file

एक पाइपलाइन एक-लाइनर के लिए एक तीसरा विकल्प है -रेप्लेस को घोंसला करना:

PS> ("ABC" -replace "B","C") -replace "C","D"
ADD

तथा:

PS> ("ABC" -replace "C","D") -replace "B","C"
ACD

यह निष्पादन आदेश को संरक्षित करता है, पढ़ने में आसान है, और एक पाइपलाइन में अच्छी तरह से फिट बैठता है। मैं स्पष्ट नियंत्रण, स्वयं-दस्तावेज इत्यादि के लिए ब्रांड्स का उपयोग करना पसंद करता हूं। यह उनके बिना काम करता है, लेकिन आप उस पर कितना भरोसा करते हैं?

- प्रतिस्थापन एक तुलना ऑपरेटर है, जो किसी ऑब्जेक्ट को स्वीकार करता है और संभावित रूप से संशोधित ऑब्जेक्ट देता है। यही कारण है कि आप ऊपर दिखाए गए अनुसार उन्हें ढेर या घोंसला कर सकते हैं।

कृपया देखें:

help about_operators

जॉर्ज हॉवर्थ द्वारा पोस्ट को एक से अधिक प्रतिस्थापन के साथ ठीक से काम करने के लिए आपको ब्रेक को हटाने की आवश्यकता है, आउटपुट को एक चर ($ line) पर असाइन करें और फिर चर को आउटपुट करें:

$lookupTable = @{
    'something1' = 'something1aa'
    'something2' = 'something2bb'
    'something3' = 'something3cc'
    'something4' = 'something4dd'
    'something5' = 'something5dsf'
    'something6' = 'something6dfsfds'
}

$original_file = 'path\filename.abc'
$destination_file =  'path\filename.abc.new'

Get-Content -Path $original_file | ForEach-Object {
    $line = $_

    $lookupTable.GetEnumerator() | ForEach-Object {
        if ($line -match $_.Key)
        {
            $line = $line -replace $_.Key, $_.Value
        }
    }
   $line
} | Set-Content -Path $destination_file

मान लीजिए कि आपके पास केवल एक 'something1' या 'something2' , प्रति पंक्ति हो सकती है, आप एक लुकअप टेबल का उपयोग कर सकते हैं:

$lookupTable = @{
    'something1' = 'something1aa'
    'something2' = 'something2bb'
    'something3' = 'something3cc'
    'something4' = 'something4dd'
    'something5' = 'something5dsf'
    'something6' = 'something6dfsfds'
}

$original_file = 'path\filename.abc'
$destination_file =  'path\filename.abc.new'

Get-Content -Path $original_file | ForEach-Object {
    $line = $_

    $lookupTable.GetEnumerator() | ForEach-Object {
        if ($line -match $_.Key)
        {
            $line -replace $_.Key, $_.Value
            break
        }
    }
} | Set-Content -Path $destination_file

यदि आप उनमें से एक से अधिक हो सकते हैं, तो बस कथन में break को हटा दें।






replace