मैं कैसे चला सकता हूं: पंक्ति के केवल भाग पर स्थानापन्न और यह सब नहीं?


15

मेरे पास इस तरह एक पंक्ति है:

function my_function(argument, another argument, but there are spaces)

मैं अंतरिक्ष पात्रों (तर्क के नामों के अंदर) को अंडरस्कोर के साथ स्थानापन्न करना चाहता हूं। मैं इस प्रकार का उपयोग करना चाहते हैं:

:s/\ /_/g

लेकिन मैं इसे पूरी लाइन पर लागू नहीं करने के लिए कैसे चुन सकता हूं, लेकिन कर्सर स्थिति? (या तीसरा शब्द)?


4
एक रेगेक्स में, वर्तमान कर्सर स्थिति का वर्णन करने के लिए आप परमाणु का उपयोग कर सकते हैं \%#। तो, आप उपयोग कर सकते हैं :s/\v(%#.*)@<= /_/g:। जिसे @<=कर्सर स्थिति के बाद ( ) वर्णों से पहले के स्थान के रूप में वर्णित किया जा सकता है ।
user9433424

1
आप और स्टेटॉक्स दोनों ने \%#चाल का प्रस्ताव दिया है , यदि आप एक नहीं लिखते हैं तो मैं उसका जवाब स्वीकार करूंगा ... लेकिन क्या आप दोनों में से किसी एक के साथ regexp को स्पष्ट रूप से समझा सकते हैं?
फेफ

जवाबों:


15

आप निम्नलिखित समाधान का उपयोग कर सकते हैं:

पहले v$कर्सर से पंक्ति के अंत तक पाठ का चयन करने के लिए उपयोग करें। फिर निम्न कमांड का उपयोग करें:

:s/\%V\ /_/g

\%Vपहले से चयनित क्षेत्र में पाठ को बदलने का संकेत दें, देखें :h /\%V

अगर मैं आपका उदाहरण लेता हूं:

function my_function(argument, another argument, but there are spaces)

यदि मेरा कर्सर 40 वें कॉलम पर है और मैंने जो कमांड लिखी है, उसका उपयोग करता हूं:

function my_function(argument, another argument,_but_there_are_spaces)

अपनी टिप्पणी के जवाब में आप भी उपयोग कर सकते हैं

  • \%# जो कर्सर स्थिति से मेल खाता है
  • \%>23c जो 23 वें कॉलम के बाद मेल खाता है।
  • \%>'m जो एक निशान की स्थिति के बाद मेल खाता है

देखें :h /\%#, :h /\%>cऔर :h /\%>'m

@ User9433424 ने \%#अपनी टिप्पणी में उपयोग करने का एक तरीका दिया । निशान के साथ पैटर्न के लिए आप इसे सेट कर सकते हैं maऔर फिर उपयोग कर सकते हैं:

:s/\%>'a /_/g

@ User9433424 द्वारा दिए गए पैटर्न की व्याख्या निम्नलिखित है:

:s/\v(%#.*)@<= /_/
:s/                    substitution command
   \v                  Enable the very magic mode
      %#.*             Any characters from the cursor position
           @<=         Check for matches just before what follows
              space    Followed by a space
               /_/     Substitute the matches by underscores

आप देखना चाहेंगे :h \vऔर:h /\@<=


यह बढ़िया काम करता है ! लेकिन मैं वास्तव में दृश्य चयन के लिए अभ्यस्त नहीं हूं और पूरी प्रक्रिया थोड़ी "भारी" लगती है ... क्या आपको लगता है कि कुछ तेज हो सकता है?
फाफ

हाँ मुझे मेरे सवाल का जवाब :) अपडेट करने दें
statox

User9433424 ने आपके सामने यह संकेत दिया था, लेकिन आपने उत्तर दिया कि मैं आपका उत्तर स्वीकार करने जा रहा हूं यदि यह ठीक है - क्या आप शायद rexxp पैटर्न की व्याख्या कर सकते हैं जो वह थोड़ा अधिक उपयोग करता है? मैं अभी भी इससे जूझ रहा हूं ...
फेफे

मैंने उत्तर को यथासंभव स्पष्ट करने की कोशिश की, लेकिन अगर @ यूजर 9433424 अपना जवाब लिखता है तो इसे स्वीकार करने में संकोच न करें।
statox

1
Regexp की बहुत अच्छी व्याख्या, धन्यवाद! और आपकी टिप्पणी के लिए धन्यवाद जिसका उत्तर स्वीकार करना है :)
Feffe

5

:h \@<=यह सुनिश्चित :h \>करने के लिए कि आप जहां चाहें वहां प्रतिस्थापन हो सकता है ( यह सुनिश्चित करने के लिए एक पूर्ववर्ती '(', और एक अंत-शब्द सीमा ) ( ) बनाने के लिए आप पीछे ( ) का उपयोग कर सकते हैं ।

तो, पाठ के साथ:

function my_function(argument, another argument, but there are spaces)

कमांड चलाना:

:s/\((.*\)\@<=\> /_/g

उत्पादन करेंगे:

function my_function(argument, another_argument, but_there_are_spaces)

यह हर बार कर्सर की स्थिति से आसान हो सकता है, बशर्ते प्रतिस्थापन हमेशा एक ज्ञात शुरुआती बिंदु हो।


2
प्रतिस्थापन में हमेशा एक ज्ञात शुरुआती बिंदु नहीं होता है: यह केवल ... टाइपो की एक अजीब श्रृंखला को सही करता है जिसे मैंने बनाया था। लेकिन आपका जवाब फिर भी दिलचस्प है, धन्यवाद!
Feffe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.