मैं विम में प्रत्येक पंक्ति के अंत में एक स्ट्रिंग कैसे जोड़ सकता हूं?


256

मैं *विम में प्रत्येक पंक्ति के अंत में जोड़ना चाहता हूं ।

मैंने कोड को असफल करने की कोशिश की

:%s/\n/*\n/g

तुम्हारा काम नहीं करता क्योंकि दाहिने हाथ की ओर :s///, \nएक अशक्त चरित्र से मेल खाती है। अनुभाग :help sub-replace-specialप्रासंगिक है।
डबलडाउन

जवाबों:


354

:%s/$/\*/g

कार्य करना चाहिए। तो :%s/$/*/gजैसा कि MrWiggles सही ढंग से बताता है।


क्या एक ही कॉलम में ' ' डालने का एक तरीका है , क्योंकि सभी लाइनें समान लंबाई की नहीं हैं, इसलिए पंक्ति 1 में 15 वें कॉलम में ' ' हो सकता है , लेकिन पंक्ति 2 में 25 वें कॉलम में '*' है।
अमन जैन

11
प्रति पंक्ति केवल 1 ईओएल है, इसलिए gझंडा अनावश्यक है।
डबलडाउन

मैं प्रत्येक पंक्ति की शुरुआत में जोड़ना चाहता था: 1, $ s / ^ / \ / g ने मेरे लिए काम किया।
farooqsadiq

@dirkgently मैं इस आदेश के तर्क के रूप में एक स्ट्रिंग चर कैसे पार कर सकता हूं (आप जानते हैं, * के बजाय)?
मथियस रोटा

353

इससे भी कम: खोज आदेश:

:%norm A*

इसका यही अर्थ है:

 %       = for every line
 norm    = type the following commands
 A*      = append '*' to the end of current line

28
यार, वहाँ कोई vi या विम धागा मौजूद नहीं है जहाँ से मैं कुछ नहीं सीखता। आज मैं मानदंड के बारे में सीखता हूं। और जैसा कि वे चीयर्स में कहते हैं, "नॉर्म!"
smcameron

4
प्रीपेडिंग के लिए, आप बस 0i * का उपयोग करेंगे, 0 आपको लाइन की शुरुआत में ले जाता है, मैं इन्सर्ट मोड के लिए, और * के लिए *। डी:
रोब

7
VimGolfer के रूप में, मैं मदद नहीं कर सकता, बल्कि जोड़ सकता हूं कि I*इसके बजाय 0i*आप एक कीस्ट्रोक को बचाएंगे।
जेडीहिया हर्ट

24
एक अन्य टिप: यह रेंज के लिए भी काम करता है। बस दृश्य मोड में लाइनों को हाइलाइट करें और दबाएं :, यह उस कमांड को पूर्व-भर देगा :'<,'>जिसके साथ आप फिर से बना सकते हैं:'<,'>norm A*
जेडीडियह हर्ट

8
प्रीपेडिंग के लिए, Iइसके बजाय का उपयोग करें -:%norm I*
लकी वास्तव में

42

इसके अलावा:

:g/$/norm A*

इसके अलावा:

gg<Ctrl-v>G$A*<Esc>

आह ... दूसरे का उपयोग लाइनों के चयन के साथ भी किया जा सकता है। अच्छा!
टिम फ्लेचर

क्या आप कृपया पहला उदाहरण बता सकते हैं?
कोड़ी पोल

@ कोडीपोल gवह globalकमांड है जो प्रत्येक मिलान रेखा के साथ कुछ करता है। $हर पंक्ति से मेल खाता है। यह ^या भी हो सकता है .*। मानदंड उन कमांड को निष्पादित करता है जो आप सामान्य रूप से कमांड मोड में उपयोग करते हैं। तो लाइन के अंत में A*संलग्न *का मतलब है ।
9

41

मुझे लगता है कि इस प्रकार की चीजों से निपटने के लिए विजुअल ब्लॉक मोड का उपयोग करना बेहतर और अधिक बहुमुखी तरीका है। यहाँ एक उदाहरण है:

This is the First line.  
This is the second.  
The third.

डालने के लिए "नमस्ते दुनिया।" इनमें से प्रत्येक पंक्ति के अंत में (space + क्लिपबोर्ड):

  • पहली पंक्ति के किसी वर्ण पर, Ctrl-V (या Ctrl-Q यदि Ctrl-V पेस्ट है) दबाएँ।
  • प्रेस जज को तीन लाइनों पर दृश्य ब्लॉक का विस्तार करने के लिए।
  • प्रत्येक पंक्ति के अंत में दृश्य ब्लॉक का विस्तार करने के लिए $ दबाएं। उसके बाद ए स्पेस दबाएं फिर हैलो वर्ल्ड टाइप करें। + फिर Esc।

परिणाम है:

This is the First line. Hello world.  
This is the second. Hello world.  
The third. Hello world.  

(उदाहरण Vim.Wikia.com से )


3
दबाने के बजाय jjकिसी Gको अंतिम पंक्ति में जाने के लिए मारा जा सकता है । यह बड़ी फ़ाइलों में उपयोगी है, जहां jअंतिम पंक्ति को दबाने तक आप व्यावहारिक नहीं हैं।
nash

सहमत हूं कि दृश्य ब्लॉक यहां सबसे अधिक साफ है, अधिक विस्तार योग्य भी है
पीटर डोलन

ध्यान दें कि ऐसा नहीं लगता है कि यह पहली बार में सभी लाइनों पर काम कर रहा है, लेकिन जब आप Esc दबाते हैं तो यह सभी के माध्यम से जाता है और इसे सभी में जोड़ता है।
नौमेनन

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

सुनिश्चित करें कि आप कैपिटल ए का उपयोग करते हैं, "ए" काम नहीं करता है।
जेफ होये

14

यदि आप प्रत्येक पंक्ति के अंत में हैलो वर्ल्ड जोड़ना चाहते हैं:

:%s/$/HelloWorld/

यदि आप इसे 20 से 30 उपयोग के लिए विशिष्ट संख्या रेखा के लिए करना चाहते हैं:

:20,30s/$/HelloWorld/

यदि आप इसे प्रत्येक पंक्ति के प्रारंभ में करना चाहते हैं तो उपयोग करें:

:20,30s/^/HelloWorld/

6

तुम gअंत में वास्तव में जरूरत नहीं है । तो यह हो जाता है:

:%s/$/*

या यदि आप केवल १४-१ the की *पंक्तियों के अंत में चाहते हैं :

:14,18s/$/*

या

:14,18norm A*

5

... (* के साथ प्रत्येक पंक्ति को जोड़ने के लिए)

%s/^/*/g

इस सवाल का जवाब नहीं है।
DoubleDown

5

एक विकल्प है:

:g/$/s//*

यह हर लाइन एन्ड एंकर को ढूंढेगा और उसका विकल्प देगा *। मैं कहता हूं "स्थानापन्न" लेकिन, वास्तविक तथ्य में, यह एक परिशिष्ट से अधिक है क्योंकि नियमित चरित्र के बजाय एंकर एक विशेष चीज है। अधिक जानकारी के लिए, Power of g - उदाहरण देखें


Regex में s / // का क्या अर्थ है? मैं एक समान कमांड जानता हूं: जी / / / पी, (जीआरईपी)। मुझे पूरा यकीन है कि आपकी कमान मेरे करीब है, कम से कम संरचना में।
लेओ लेपोल्ड हर्ट्ज़ '

1
S स्थानापन्न है - यह तारांकित के साथ लाइन एंकर के अंत को प्रतिस्थापित करता है (ठीक है, वास्तव में इसे प्रतिस्थापित नहीं करता है क्योंकि यह एंकर बिंदु है)।
paxdiablo

3
:% S / \ N / * \ r / जी

आपका पहला एक और कहीं भी सही है, लेकिन विम को किसी कारण से अलग-अलग न्यूलाइन को संभालना होगा।


मेरे संस्करण में Vim \ n काम करता है, लेकिन यह सिर्फ एक * के साथ नई रेखा को प्रतिस्थापित करता है, प्रभावी रूप से लाइनों में शामिल होता है।
नाथन फेलमैन

1
यह कमांड मेरे द्वारा आजमाए गए विम के हर संस्करण पर ठीक काम करने के लिए सत्यापित है। क्या आप विंडोज़ संस्करण या कुछ का उपयोग कर रहे हैं?

1
%s/\s*$/\*/g

यह चाल चलेगा, और यह सुनिश्चित करेगा कि प्रमुख स्थानों की अनदेखी की जाए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.