2012-02-23 7 views
13

यह मेरे पिछले सवाल के जवाब में है:PowerShell: का हवाला देते हुए -replace और चर

PowerShell: -replace, regex and ($) dollar sign woes

मेरा प्रश्न है:

'abc' -replace 'a(\w)', '$1' 
'abc' -replace 'a(\w)', "$1" 

: क्यों कोड के इन 2 लाइनों विभिन्न उत्पादन और नीचे दिए गए 2 लेखों के मुताबिक, सिंगल कोट्स में परिवर्तनीय '$ 1' का उपयोग शाब्दिक स्ट्रिंग के रूप में क्यों नहीं किया जाता है? सिंगल कोट्स में सब कुछ एक शाब्दिक पाठ स्ट्रिंग के रूप में माना जाना चाहिए, है ना?

http://www.computerperformance.co.uk/powershell/powershell_quotes.htm
http://blogs.msdn.com/b/powershell/archive/2006/07/15/variable-expansion-in-strings-and-herestrings.aspx

उत्तर

18

आप एकल उद्धरण का उपयोग करें जब आप PowerShell बता उद्घाटन के बीच एक स्ट्रिंग शाब्दिक अर्थ सब कुछ का उपयोग करने के लिए और बोली को बंद करने का शाब्दिक व्याख्या की जा रहा है।

जब आप डबल कोट्स का उपयोग करते हैं, तो PowerShell डबल कोट्स के अंदर विशिष्ट वर्णों की व्याख्या करेगा।

get-help about_quoting_rules देखें या here पर क्लिक करें।

डॉलर के हस्ताक्षर नियमित अभिव्यक्तियों और पावरशेल में एक विशेष अर्थ है। यदि आप नियमित अभिव्यक्ति के रूप में उपयोग किए जाने वाले डॉलर के चिह्न का इरादा रखते हैं तो आप सिंगल कोट्स का उपयोग करना चाहते हैं।

आपके उदाहरण में regex a(\w) अक्षर 'ए' से मेल खाता है और उसके बाद एक संदर्भ वर्ण वापस संदर्भ # 1 में कैप्चर किया जाता है। तो जब आप $1 के साथ प्रतिस्थापित करते हैं तो आप मिलान संदर्भ ab को पीछे संदर्भ मिलान b के साथ बदल रहे हैं। तो आपको bc मिलते हैं।

डबल कोट्स का उपयोग करने के साथ आपके दूसरे उदाहरण में PowerShell "$1" को $1 के साथ एक स्ट्रिंग के रूप में व्याख्या करता है। आपके पास $1 नामक एक चर नहीं है, इसलिए यह शून्य है। तो रेगेक्स ने ab को नल के साथ बदल दिया, यही कारण है कि आपको केवल c मिलते हैं।

+1

(प्रकाश में सिर बंद हो जाता है) Ma एन धन्यवाद। अच्छी तरह से समझाया। – Vippy

3

'$ 1' एक रेगेक्स बैकरेफर है। यह रेगेक्स मैच द्वारा बनाया गया है, और यह केवल उस प्रतिस्थापन के संदर्भ में मौजूद है। यह एक शक्तिशील चर नहीं है।

"$ 1" को पावरहेल चर के रूप में व्याख्या किया जाएगा। यदि $ 1 नामक कोई चर नहीं है, तो प्रतिस्थापन मान शून्य हो जाएगा।

+0

इसके अलावा, आपकी अंतर्दृष्टि के लिए धन्यवाद। कुछ भी मदद करता है। – Vippy

11

अपने दूसरी पंक्ति में:

'एबीसी' -replace 'एक (\ डब्ल्यू)', "$ 1"

Powershell $ 1 पहले यह ऑपरेशन की जगह regex के लिए हो जाता है की जगह, जैसा कि अन्य ने कहा है।आप एक बैकटिक का उपयोग करके कि प्रतिस्थापन से बच सकते हैं के रूप में:

'एबीसी' -replace 'एक (\ डब्ल्यू)', "` $ 1 "

इस प्रकार, आप में एक स्ट्रिंग था एक चर $ उपसर्ग जो आप प्रतिस्थापन स्ट्रिंग में शामिल करना चाहता है, तो आप इस तरह दोहरे उद्धरण में इसका इस्तेमाल कर सकते हैं:

'एबीसी' -replace 'एक (\ डब्ल्यू)', "$ prefix` $ 1"

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