विम: कैसे हर दूसरी पंक्ति को हटाने के लिए?


99

यह विम में कैसे करें:

इससे पहले:

aaa
bbb
ccc
ddd
eee
fff

उपरांत:

aaa
ccc
eee

आपको एक मैक्रो का उपयोग करने में सक्षम होना चाहिए: अयस्कलीनेट.com
मार्क विल्किंस

मुझे इस एक के जवाब का धन पसंद है। पसंदीदा बनाना।
froggythefrog सेप

जवाबों:


105

आप इसके लिए मैक्रो का उपयोग कर सकते हैं। निम्न कार्य करें।

  • कमांड मोड में शुरू करें।
  • दबाकर फ़ाइल की शुरुआत में जाएं gg
  • प्रेस करें qq
  • नीचे तीर पर क्लिक करें और ddबाद में दबाएँ ।
  • प्रेस करें q
  • दबाएँ 10000@q

PS: कमांड मोड में जाने के लिए बस एक-दो बार एस्केप को दबाएं।


11
मान लें कि आपकी फ़ाइल 20,000 रेखा से कम लंबी है :-)
paxdiablo

3
दरअसल आप गलत हैं माइकल। यह त्रुटिपूर्ण रूप से काम करता है क्योंकि VI फ़ाइल के अंत में आते ही मैक्रो को चलाना बंद कर देगा। आप बहुत आसानी से ऊपर के नमूने के साथ इसे आज़मा सकते हैं।
रुई

1
ठीक है, किसी भी मैक्रो की तरह आपको इसे पहली बार सही करने की आवश्यकता है लेकिन इसके बाद आप केवल 10000 @ q टाइप करके किसी भी फाइल पर आवेदन कर सकते हैं। किसी भी तरह से मेरा मानना ​​है कि यह सिर्फ स्वाद की बात है इसलिए मैं निश्चित रूप से दार्शनिक बहस शुरू नहीं करने जा रहा हूं। :)
रुई

3
मैं 'मैक्रो' का उपयोग करना पसंद करता हूं। मैक्रो का उपयोग करते हुए, आप यह वर्णन करते हैं कि आप किसी विशेष कार्य को कैसे हल करेंगे और VIM को आपके लिए दोहराएंगे। आरयूआई, मैं तीर कुंजी के बजाय 'जे' का उपयोग करना पसंद करूंगा।
SolutionYogi

4
:g/^/+dउपयोगकर्ता से stackoverflow.com/users/254635/ib (bellow) इसे हल करने के लिए अधिक सुरुचिपूर्ण तरीका है।
सर्जियोअराउजो

254

कार्य को पूरा करने का एक सुरुचिपूर्ण (और कुशल) तरीका कमांड :+deleteका उपयोग करके प्रत्येक लाइन पर वर्तमान एक के बाद लाइन को हटाने वाली कमांड को लागू करना है :global:

:g/^/+d

10
इस उत्तर को अधिक वोट क्यों नहीं मिले? यह इतना साफ और सरल है। वैकल्पिक रूप से आप पहली पंक्ति को हटा सकते हैं और उपरोक्त कमांड को सभी विषम रेखाओं को हटाने के लिए चला सकते हैं।
उसगी

3
@Usagi: धन्यवाद! मैं इसके बारे में उसी तरह महसूस करता हूं। और हाँ, आप बिलकुल सही हैं, :1d|g/^/+dविषम रेखाओं को हटाता है।
ib।

@Usagi दूसरे जवाब को 'सबसे अच्छा जवाब' के रूप में चुना गया था, 2 साल पहले उसका जवाब दिखाई दिया था। इसके अलावा, हालांकि यह अधिक सुरुचिपूर्ण समाधान है, इसे और अधिक उपयोगी तरीके से लिखा जा सकता था (यानी इसमें कोई ^ का उल्लेख नहीं है, जबकि मैक्रो किसी के लिए भी समझना आसान है)।
user1271772

3
क्षमा करें, लेकिन इस बात के स्पष्टीकरण के बिना कि यह कमांड वांछित व्यवहार कैसे करता है, मैं इसे नहीं बढ़ाऊंगा, और इसके बजाय स्वीकृत उत्तर को प्राथमिकता दूंगा, क्योंकि मैं समझता हूं कि यह लक्ष्य कैसे पूरा करता है। यह अंतर है कि एक आदमी को मछली दी जाए और उसे मछली कैसे सिखाई जाए।
गाबे

3
मुझे पता नहीं है, इस उत्तर ने मुझे बाहर जाने और मछली के साथ सीखने के लिए बनाया: जी कमांड (यही है, इसने मुझे इस पृष्ठ को बनाया - vim.wikia.com/wiki/Power_of_g )।
snetch

67

हम दिए गए सामान्य मोड कमांड का उपयोग :normalया :normनिष्पादित कर सकते हैं । स्रोत।

:%norm jdd

15
इस उत्तर पर पर्याप्त ध्यान नहीं दिया जाता है, संभवतः क्योंकि यहाँ और लिंक किए गए, गन्दा, धोखा पत्र दोनों पर स्पष्टीकरण की कमी है। मानक कमांड सामान्य मोड कमांड चलाता है जो इसके अक्षर के बराबर है। तो यहाँ यह एक लाइन को स्थानांतरित करने के लिए j चल रहा है, और इसे हटाने के लिए dd है। यह इस मामले में अधिक 'j' जोड़कर Xth लाइन के लिए सामान्य है।
इमोटामा

5
और% 1 के लिए आशुलिपि है, $ (पंक्ति 1 से अंत तक निम्नलिखित कमांड को निष्पादित करें)
लेम्बर्ट

3
%norm ddjयदि आप विषम पंक्तियों को हटाना चाहते हैं तो मुझे इसमें रुचि क्यों नहीं है।
साइकर

10
:map ^o ddj^o
^o

यहाँ ^ CTRL के लिए खड़ा है। प्रत्येक दो लाइन की एक लाइन को हटाने के लिए रिकर्सिव मैक्रो। अपनी पहली पंक्ति को अच्छी तरह से चुनें और यह हो चुका है।


8

से vim मेल संग्रह :

:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile

(Vim कमांड लाइन पर एक लाइन पर टाइप करने के लिए, पंक्ति 1,3,5,7, को हटा देगा ...)


4
तब मैं पसंद करूँगा !perl -ne 'print unless $. % 2':-)
एलेक्स ब्रासेटविक

और, एलेक्स, मैं निश्चित रूप से तुम्हारा समाधान पसंद करेंगे, लेकिन इस पर विचार के बाद से यह केवल समझदार समाधान का उपयोग केवल यहाँ ही है।
माइकल क्रेलिन - हैकर

मैक्रो तरीका इतना आसान है।
trusktr

+1 लचीलेपन के कारण if (expression)जिसके साथ यह हर तीसरी पंक्ति आदि के लिए भी काम करता है
जेन्स

5

आप हमेशा शेल कमांड को पाइप कर सकते हैं, जिसका अर्थ है कि आप अपनी पसंद की किसी भी स्क्रिप्टिंग भाषा का उपयोग कर सकते हैं:

:%!perl -nle 'print if $. % 2'

(या "जब तक" के बजाय "यदि" का उपयोग करें, तो आप कौन सी लाइनों पर निर्भर करते हैं)


आपको -lपर्ल के स्विच की आवश्यकता नहीं है ... इसके अलावा, मैं कहूंगा कि awkपर्ल से थोड़ा अधिक व्यापक है, हालांकि यह वास्तव में इन दिनों बहुत अधिक नहीं है, और यह कम कर सकता है: :%!awk NR\%2या :%!awk 1-NR\%2अन्य लाइनों के लिए।
१२

4
:%!awk -- '++c\%2'

वैकल्पिक रूप से

:%!awk -- 'c++\%2'

जिसके आधार पर आप आधा खरपतवार निकालना चाहते हैं।


उम्म, क्यों नहीं मौजूदा NRचर का उपयोग करें ?
१२:०३ पर १२

सही। क्योंकि मैं इसके बारे में भूल गया था। ;-) लेकिन वास्तव में, "उचित" संस्करण एनआर के साथ और भी लंबा होगा। और दो अच्छे दिखने वाले समकक्ष नहीं होंगे।
माइकल क्रेलिन - हैकर

:%!awk NR\%2या :%!awk 1-NR\%2, जैसा कि मैंने एक और टिप्पणी में पोस्ट किया है। वह शायद ही लंबा हो।
19hem में

1
1-NRसे लंबा है c++। हां, मुझे पता है कि यह एक चरित्र है। जैसे मैंने कहा - असली कारण यह है कि मैं इसके बारे में भूल गया। वैसे भी, लगता है कि लोग यहां की खूबसूरती की सराहना नहीं करते हैं।
माइकल क्रेलिन -

और :) की NRतुलना में कम है++c
अल्पकालिक

3

आप विम की अपनी खोज और स्थानापन्न क्षमताओं का उपयोग कर सकते हैं जैसे: अपना कर्सर पहली पंक्ति में रखें, और सामान्य मोड में टाइप करें:

:.,/fff/s/\n.*\(\n.*\)/\1/g
  • .,/fff/प्रतिस्थापन के लिए सीमा है। इसका मतलब है "इस रेखा से उस रेखा से जो रेग्ज से मेल खाती है fff(इस मामले में, अंतिम पंक्ति)।
  • s///स्थानापन्न कमांड है। यह एक रेगेक्स की तलाश करता है और इसकी हर घटना को एक स्ट्रिंग के साथ बदल देता है। gअंत का मतलब है पर जब तक regex पाए जाने रहता प्रतिस्थापन को दोहराने के लिए।
  • रेगेक्स \n.*\(\n.*\)एक नई रेखा से .*मेल खाता है , फिर एक पूरी पंक्ति (एक नई पंक्ति को छोड़कर किसी भी वर्ण से मेल खाती है), फिर एक अन्य पंक्ति और दूसरी पंक्ति। कोष्ठक \(और \)उनके अंदर की अभिव्यक्ति को दर्ज करने का कारण बनता है, इसलिए हम बाद में इसका उपयोग कर सकते हैं\1
  • \1 समूहीकृत न्यूलाइन और उसके बाद की लाइन को सम्मिलित करता है, क्योंकि हम नहीं चाहते कि अगली पंक्ति भी चले - हम बस चाहते हैं कि प्रतिस्थापन तंत्र इसके पास से गुजरे ताकि हम इसे अगले प्रतिस्थापन में न हटाएं।

इस तरह आप उस सीमा को नियंत्रित कर सकते हैं जिसमें आप विलोपन करना चाहते हैं, और आपको किसी बाहरी उपकरण का उपयोग करने की आवश्यकता नहीं है।


या $के बजाय /fff/, अंत फ़ाइल फ़ाइल की सामग्री की परवाह किए बिना के लिए।
१२

3

एक अन्य दृष्टिकोण के रूप में आप भी अजगर का उपयोग कर सकते हैं यदि आपके विम के पास इसके लिए समर्थन है।

:py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2]

b = cb[:]वर्तमान बफर में सभी लाइनों को अस्थायी रूप से कॉपी करता है bb[::2]बफर से हर दूसरी लाइन प्राप्त करता है और इसे पूरे वर्तमान बफर को असाइन करता है cb[:]। प्रतिलिपि bआवश्यक है क्योंकि बफर ऑब्जेक्ट विस्तारित स्लाइस सिंटैक्स का समर्थन नहीं करते हैं।

यह शायद "विम तरीका" नहीं है, लेकिन अगर आप अजगर जानते हैं तो याद रखना आसान हो सकता है।


2

विषम पंक्तियों (1,3,5, ..) को हटाने के लिए -> :%s/\(.*\)\n\(.*\)\n/\2\r/g

यहां तक ​​कि लाइनों को हटाने के लिए (2,4,6, ..) -> :%s/\(.*\)\n.*\n/\1\r/g

पाठ के लिए खोजें (पहली पंक्ति के रूप में) एक नई पंक्ति के चरित्र के बाद और कुछ और पाठ (दूसरी पंक्ति के रूप में) के बाद एक और नई पंक्ति का चरित्र और ऊपर या तो पहले मैच (विषम रेखा) या दूसरे मैच (यहां तक ​​कि रेखा) के साथ बदलें गाड़ी वापसी के बाद।


0

इनका सेवन करें:

:% !sed -e '2~2 d'

^^^^                  pipe file through a shell command
    ^^^^^^            the command is sed, and -e describes an expression as parameter
            ^^^^^     starting with the second line, delete every second line

-1

उपाय

आप इस कोशिश कर सकते हैं vim में

:1,$-1g/^/+1d

संपादित करें

मैं और अधिक स्पष्ट होने की कोशिश करूँगा (दो भाग)

पहला भाग चयन सीमा ( :from,to)
दूसरा भाग क्रिया ( dहटाएं)

  • यदि पहली पंक्ति से अंतिम लेकिन एक रेखा है तो रेंज (:1,$-1 ) तक
  • Globaly ( g) हटाएँ ( +1d) अगली पंक्ति

आप अपनी फ़ाइल की पहली पंक्ति में जाने का प्रयास कर सकते हैं और निष्पादित :+1dकर पाएंगे और अगली पंक्ति गायब हो जाएगी

मुझे पता है कि यह मैला है, लेकिन यह विम है और यह काम करता है


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