विम में सभी मिलान पाठ का चयन करें?


5

मेरे पास डेटा का एक गुच्छा है, और मैं सब कुछ करना चाहता हूं जो निम्नलिखित रेगेक्स से एक रजिस्टर से मेल खाता है:

/'user': '[a-Z]*'

क्या वेनिला विम में रजिस्टर करने के लिए सभी मैचों को कॉपी करने का कोई तरीका है? मैंने इस प्रश्न को देखा है , लेकिन यह केवल एक परिणाम के लिए काम करता है, अगले परिणाम पर जाने के लिए 'n' दबाने के बाद, यह '// e' का फिर से उपयोग करेगा और इसके बजाय अगले परिणाम के अंत में जाएगा, इसकी शुरुआत हुई।

मैंने इस SO प्रश्न पर भी गौर किया है । यह लगभग वही है जो मैं देख रहा हूं, सिवाय इसके कि मैं उन लाइनों के बजाय विशेष मैचों के साथ काम करने के लिए इसे कैसे बदल सकता हूं।


क्या कभी प्रति पंक्ति एक से अधिक मैच होते हैं?
evilsoup

हां, प्रति लाइन कई मैच
मार्कस बफेट

जवाबों:


7

यह केवल फ़्लैग सेट के :sसाथ एक कमांड चलाकर प्राप्त किया जा सकता है n(जो मूल रूप से कहता है, किसी भी चीज़ को प्रतिस्थापित नहीं करने के लिए (लेकिन \=बदले हुए भाग में एक का उपयोग करके , आप अभी भी मैचों को देख सकते हैं :h sub-replace-special)

qaq

तब आप एक का उपयोग करके रजिस्टर में अपने maches पर कब्जा कर सकते हैं:

:%s/'user': '[a-Z]*'/\=setreg('A', submatch(0), 'V')/gn

और अपने मैचों को चिपकाएँ:

:put A

इसके लिए कम से कम Vim 7.4 (मैं वास्तविक पैच नंबर भूल गया)।


यह प्रत्येक मैच को अपनी लाइन पर रखता है, जो कि ज्यादातर समय उपयोगी व्यवहार होता है। एक एकल पूर्व मोड कमांड होने के नाते, यह वास्तव में बड़ी फ़ाइलों के लिए मेरे मैक्रो से भी तेज होगा। +1।
evilsoup

ठीक है, आप निश्चित रूप से इसे एक सूची में कैद कर सकते हैं और फिर बाद में उसके साथ जो चाहें कर सकते हैं। यह सिर्फ एक उदाहरण था क्योंकि ओपी इसे एक रजिस्टर में कैद करना चाहता था।
क्रिश्चियन ब्रेबांट

3

"'a' रजिस्टर साफ़ करें

qaq

"वैश्विक खोज और सभी पंक्तियों ('ए') को 'ए' रजिस्टर में।

:g/'user': '[a-Z]*'/y A

:g/ and /y Aआवश्यकतानुसार भाग को संशोधित करें ।

"दूसरी फाइल में पेस्ट करें

"aP


डेटा सब एक लाइन पर है
मार्कस बफेट

प्रति पंक्ति एक लाइन मिलनी चाहिए। यदि प्रति पंक्ति में पाया स्ट्रिंग के कई उदाहरण हैं, तो दोनों को एक ही आउटपुट लाइन में सूचीबद्ध किया जाएगा।
ब्रूम्डोडर्गर

मेरा मतलब है, पाठ, सभी डेटा, सिर्फ एक लाइन है, यह सिर्फ एक लाइन नहीं होगा?
मार्कस बफेट

हां, मुझे नहीं पता था कि आपका डेटा एक लंबी लाइन थी।
ब्रूअडोडेगर

0

आप :YankMatchesमेरे ExtractMatches प्लगइन से कमांड का उपयोग कर सकते हैं :

:%YankMatches /'user': '[a-Z]*'/

प्रत्येक मैच को डिफ़ॉल्ट रूप से एक नई लाइन पर रखा जाता है; एक अन्य विभाजक का उपयोग करने के लिए, एक वैकल्पिक रूप है।


क्या यह प्लगइन वास्तव में काम करता है? कमांड के साथ बहुत सारी त्रुटियां%YankMatches /re.sub([^)]*)/
hhh

1
@hhh: आपको मेरी इंगो-लाइब्रेरी प्लगइन स्थापित करने की भी आवश्यकता है । यह प्लगइन के अनुभाग में एक DEPENDENCY के रूप में सूचीबद्ध है।
इंगो करकट

0

शायद एक बेहतर तरीका है (ये अक्षम हैं यदि हम वास्तव में बड़ी संख्या में प्रविष्टियों के बारे में बात कर रहे हैं - यह तब तक ठीक होना चाहिए जब तक हम हजारों और हजारों की बात नहीं कर रहे हैं), लेकिन पहली बात जो दिमाग में आती है वह एक बहुत है पुनरावर्ती मैक्रो। सबसे पहले, रैप्सकैन विकल्प को चालू करें ताकि खोज जो फ़ाइल के अंत तक पहुंच जाए, वह फिर से शुरुआत के आसपास लूप न करे (अन्यथा आप अनंत लूप के साथ समाप्त हो जाएंगे):

:set nowrapscan

फिर, सुनिश्चित करें कि आपके पास दो स्पष्ट रजिस्टर हैं:

qqq
qaq

अब, जादू:

qq/'user': '[a-Z]*'
"Ay//e
@qq

qqरजिस्टर करने के लिए अपने सभी कीस्ट्रोक रिकॉर्डिंग शुरू करता है q। कैपिटल लेटर का इस्तेमाल करने से उस रजिस्टर को अपग्रेड करने की बजाय विम अपेंड हो जाता है। y//eअपनी खोज के अंत में yanks। मैक्रो के रूप @qमें (वर्तमान में खाली) qरजिस्टर को कॉल करता है , और अंतिम qरिकॉर्डिंग बंद कर देता है। फिर, बस:

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