2010-01-20 9 views
23

मेरे पास <Foobar Name='Hello There'/> जैसा कुछ है और एकल उद्धरण चिह्नों को दोहरे उद्धरण चिह्नों में बदलने की आवश्यकता है। मैंने :s/\'.*\'/\"\0\" की कोशिश की लेकिन यह <Foobar Name="'Hello There'"/> का उत्पादन समाप्त हो गया। \0 को \1 के साथ प्रतिस्थापित करने से केवल डबल कोट्स के अंदर एक खाली स्ट्रिंग उत्पन्न हुई - क्या कुछ विशेष वाक्यविन्यास है, मुझे याद आ रही है कि मुझे \1 पर उद्धरण चिह्नों के अंदर केवल पाया गया स्ट्रिंग ("हैलो वहां") बनाने की आवश्यकता है?विम में तारों के चारों ओर उद्धरण चिह्नों को प्रतिस्थापित करना?

उत्तर

20

आप समूहों का उपयोग करने की जरूरत है:

:s/\'\(.*\)\'/\"\1\" 

इस तरह तर्क 1 (यानी, \ 1) जो कुछ भी \ द्वारा सीमांकित किया जाता है के अनुरूप (और \)।

2

आपको उस अभिव्यक्ति के हिस्से के चारों ओर गोल ब्रैकेट डालने की आवश्यकता है, जिसे आप कैप्चर करना चाहते हैं।

s/\'\(.*\)\'/"\1"/ 

लेकिन, आपको अनजाने मिलान के साथ समस्या हो सकती है। क्या आप अपनी फ़ाइल में डबल कोट्स के साथ किसी भी एकल उद्धरण को प्रतिस्थापित करने में सक्षम हो सकते हैं?

5

जब तक कि मुझे कुछ याद नहीं आ रहा है, s/\'/"/g काम नहीं करेगा?

+0

यह मेरा समझौता था, लेकिन मुझे लगा कि यह बिल्कुल सही नहीं था, खासकर यदि विशेषता के अंदर एक ही उद्धरण था। मुझे नहीं लगता कि एक्सएमएल में हो सकता है, लेकिन यह किसी अन्य स्थिति में सड़क के नीचे हो सकता है जिसके लिए इसी समाधान की आवश्यकता होती है। – ravuya

+0

एकल-उद्धृत विशेषता के अंदर एक एकल उद्धरण ''' होना चाहिए और डबल-उद्धृत विशेषता के अंदर एक डबल कोट '"' होना चाहिए। बेशक एक एकल उद्धरण एक डबल उद्धृत विशेषता के अंदर रह सकता है और इसके विपरीत ... – ephemient

1

आपको सही विचार मिल गया है - आप अपने प्रतिस्थापन खंड के रूप में "\1" रखना चाहते हैं, लेकिन आपको पहले समूह को कैप्चर करने में "हैलो वहां" भाग रखना होगा (0 पूरा मिलान है)। प्रयास करें:

:%/'\(.*\)'/"\1"

13

%s/'\([^']*\)'/"\1"/g

आप का उपयोग करने के [^']* बजाय .* की अन्यथा

'apples' are 'red'"apples' are 'red"

+1

या '। *' 'के बजाय'। \ {-} 'का उपयोग करें। देखें ': सहायता/\ {- '। –

48

परिवर्तित हो जाएगा वहाँ भी है surround.vim, आप के लिए देख रहे हैं चाहते हैं यह काफी बार करो। आस-पास के उद्धरण बदलने के लिए आप cs'" का उपयोग करेंगे।

+0

surround.vim लिंक के लिए धन्यवाद - मैं लंबे समय से इस के लिए काम कर रहा था। – ThomasH

+0

क्या यह कुछ नेता आदेश के लिए मैप करने का कोई तरीका है? मैं इसे करने के लिए नहीं कर सकता: \ –

+0

आपको इसे एक नेता कमांड में मैप करने की आवश्यकता नहीं है, क्योंकि यह दो तर्कों के साथ एक कस्टम 'सीएस 'गति का उपयोग कर रहा है -'' 'लक्ष्य के रूप में, और' '' प्रतिस्थापन – kejadlen

6

बस एक FYI करें - एक साथ सभी दोहरे उद्धरण चिह्नों को बदलने के लिए, यह सही regexp है - ऊपर

:%s/"\([^"]*\)"/'\1'/g 
0

rayd09 की मिसाल मानकर आप एक पूरे फ़ाइल पर ऐसा करना चाहते हैं के आधार पर ...

एन मोड:

ggvG$ [SHIFT+:] 

एक्स मोड:

'<,'>/'/" [RET] 
संबंधित मुद्दे