कुशलतापूर्वक एक लाइन को कई लाइनों में कैसे विभाजित किया जाए?


11

मुझे एक पाठ फ़ाइल में लॉग डेटा प्राप्त हुआ है जो एक स्थान द्वारा अलग किए गए प्रत्येक मान के साथ सिर्फ एक लंबी रेखा है। क्या कोई कमांड या कमांड है जो एक लाइन को कई लाइनों में विभाजित करेगा?

जवाबों:


21

आप बस लाइन पर किसी भी निरंतर स्थान को कमांड का उपयोग करके एक नई रेखा के साथ बदल सकते हैं :s/\s\+/\r/g\s\+मतलब एक या एक से अधिक व्हाट्सएप वर्ण, और \rएक नई पंक्ति है, देखें :help :substituteऔर :help regexpविवरण के लिए। यदि आप एक लाइन पर कमांड चलाते हैं जैसे:

foo bar baz

आपको मिला:

foo
bar
baz

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

function! SplitLineNicely()
    " Save previous value of last search register
    let saved_last_search_pattern = @/

    " :substitute replaces the content of the search register with the `\s\+` 
    " pattern highlighting all whitespaces in the file
    substitute /\s\+/\r/g

    " Restore previous search register
    let @/ = saved_last_search_pattern
endfunction

"यदि आप हर जगह हाइलाइट किए गए स्थानों के साथ अपनी स्क्रीन को अव्यवस्थित नहीं करना चाहते हैं" तो यह ओपी के सेटअप के बारे में बहुत अधिक मानता है।
रोमेनियल

@romainl बेहतर है?
toro2k

1
हाँ, यह बेहतर है IMO।
रोमेनियल

2
यह है \r, देखें :help s/\r। यह एक शाब्दिक newline टाइपिंग द्वारा प्रतिस्थापित किया जा सकता है <c-v><cr>। इस संदर्भ \nमें एक अशक्त चरित्र है, देखें :help s/\n
toro2k 16

1
replaces the content of the register- कौन सा रजिस्टर?
स्टिलानोबोब

5

vimअपने काम को पूरा करने के बेहतर तरीकों में से एक है प्रतिस्थापन का उपयोग करना , लेकिन आप एक मैक्रो का भी उपयोग कर सकते हैं। मान लें कि हमारे पास निम्न डेटा है, पंक्ति 1 पर कहीं कर्सर के साथ:

1 a b c d e f
~

सामान्य मोड में शुरू, मारने qqसे मैक्रो कॉल करने योग्य रिकॉर्डिंग शुरू हो जाएगी @q। बाद में टाइप की गई qqकिसी भी चीज को पूर्वोक्त कॉल के माध्यम से दोहराया जा सकेगा। हमारा लक्ष्य सामान्य आदेशों को दर्ज करना है जो सहज पुनरावृत्ति की अनुमति देने के लिए पर्याप्त सामान्य होंगे।

इस प्रकार, हम 0कर्सर को लाइन की शुरुआत में लाने के लिए टाइप कर सकते हैं , फिर fspaceकर्सर को पहले स्थान पर ले जाने के लिए। यह हमें तब टाइप करने की अनुमति देता है renter, जिसके परिणामस्वरूप:

1 a
2 b c d e f
~

qअब हिट करना एक अच्छा विचार है क्योंकि हमारी पुन: प्रयोज्य मैक्रो दोहराव के लिए तैयार है। कुछ हद तक मनमाने ढंग से, हम ध्यान दें कि नई जगह को बदलने के लिए 4 स्थान बचे हैं। इस प्रकार, मारने से 4@q, हम q4 बार दोहराते हैं, जिसके परिणामस्वरूप:

1 a
2 b
3 c
4 d
5 e
6 f
~

ध्यान दें कि जिस तरह से हम मैक्रो की स्थापना की है, यह सुरक्षित 9000 से अधिक बार आदेश को दोहराने के लिए, के रूप में यह केवल वर्तमान पंक्ति को प्रभावित करती है हो गया होता, और के बाद से वहाँ पिछले डेटा प्रविष्टि के अधिकार के लिए कोई रिक्त स्थान थे, fspaceहोगा 'अच्छी तरह से' विफल, डेटा को नई सुर्खियों से बदलने से रोक रहा है।

इसलिए शुरुआत से दोहराना:

qq0fspacerenterq9001@q

हमारा परिणाम प्रदान करता है।


1
मुझे लगता है कि 9001आपके उपयोगकर्ता नाम को तेज़ी से टाइप करने के लिए आपके पास एक कुंजी है।
रिच

5

विम में लाइनों को विभाजित करने का सबसे आसान तरीका सामान्य मोड कमांड है gq(सामान्य या दृश्य मोड में त्वरित उत्तराधिकार में दोनों अक्षर टाइप करें)।

दृश्य मोड में, जो कुछ भी चुना गया है, वह विभाजित हो जाएगा, सामान्य मोड में, आप gqएक गति के साथ अनुसरण करते हैं।

उदाहरण के लिए, gqlवर्तमान में निर्धारित चौड़ाई में एक पंक्ति को विभाजित करेगा। अपनी वर्तमान सेटिंग से अलग होने के लिए विभाजित लाइनों की चौड़ाई निर्धारित करने के लिए, आप उपयोग कर सकते हैं :set textwidth=n, जहां nआप एक पंक्ति में जितने वर्ण चाहते हैं, उदाहरण के लिए, 10और जब आप काम कर रहे हों तो अपनी सामान्य चौड़ाई में वापस बदल सकते हैं।

Kholidfu द्वारा एक Youtube वीडियो की इस जानकारी को प्राप्त किया गया है जिसमें दिखाया गया है कि गति का उपयोग करके सामान्य मोड में लाइनों को कैसे जोड़ा और विभाजित किया जाए।

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