यह विम में कैसे करें:
इससे पहले:
aaa
bbb
ccc
ddd
eee
fff
उपरांत:
aaa
ccc
eee
यह विम में कैसे करें:
इससे पहले:
aaa
bbb
ccc
ddd
eee
fff
उपरांत:
aaa
ccc
eee
जवाबों:
आप इसके लिए मैक्रो का उपयोग कर सकते हैं। निम्न कार्य करें।
gg।qq।ddबाद में दबाएँ ।q।10000@qPS: कमांड मोड में जाने के लिए बस एक-दो बार एस्केप को दबाएं।
:g/^/+dउपयोगकर्ता से stackoverflow.com/users/254635/ib (bellow) इसे हल करने के लिए अधिक सुरुचिपूर्ण तरीका है।
कार्य को पूरा करने का एक सुरुचिपूर्ण (और कुशल) तरीका कमांड :+deleteका उपयोग करके प्रत्येक लाइन पर वर्तमान एक के बाद लाइन को हटाने वाली कमांड को लागू करना है :global:
:g/^/+d
:1d|g/^/+dविषम रेखाओं को हटाता है।
हम दिए गए सामान्य मोड कमांड का उपयोग :normalया :normनिष्पादित कर सकते हैं । स्रोत।
:%norm jdd
%norm ddjयदि आप विषम पंक्तियों को हटाना चाहते हैं तो मुझे इसमें रुचि क्यों नहीं है।
:map ^o ddj^o
^o
यहाँ ^ CTRL के लिए खड़ा है। प्रत्येक दो लाइन की एक लाइन को हटाने के लिए रिकर्सिव मैक्रो। अपनी पहली पंक्ति को अच्छी तरह से चुनें और यह हो चुका है।
से vim मेल संग्रह :
:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile
(Vim कमांड लाइन पर एक लाइन पर टाइप करने के लिए, पंक्ति 1,3,5,7, को हटा देगा ...)
!perl -ne 'print unless $. % 2':-)
if (expression)जिसके साथ यह हर तीसरी पंक्ति आदि के लिए भी काम करता है
आप हमेशा शेल कमांड को पाइप कर सकते हैं, जिसका अर्थ है कि आप अपनी पसंद की किसी भी स्क्रिप्टिंग भाषा का उपयोग कर सकते हैं:
:%!perl -nle 'print if $. % 2'
(या "जब तक" के बजाय "यदि" का उपयोग करें, तो आप कौन सी लाइनों पर निर्भर करते हैं)
-lपर्ल के स्विच की आवश्यकता नहीं है ... इसके अलावा, मैं कहूंगा कि awkपर्ल से थोड़ा अधिक व्यापक है, हालांकि यह वास्तव में इन दिनों बहुत अधिक नहीं है, और यह कम कर सकता है: :%!awk NR\%2या :%!awk 1-NR\%2अन्य लाइनों के लिए।
:%!awk -- '++c\%2'
वैकल्पिक रूप से
:%!awk -- 'c++\%2'
जिसके आधार पर आप आधा खरपतवार निकालना चाहते हैं।
NRचर का उपयोग करें ?
:%!awk NR\%2या :%!awk 1-NR\%2, जैसा कि मैंने एक और टिप्पणी में पोस्ट किया है। वह शायद ही लंबा हो।
1-NRसे लंबा है c++। हां, मुझे पता है कि यह एक चरित्र है। जैसे मैंने कहा - असली कारण यह है कि मैं इसके बारे में भूल गया। वैसे भी, लगता है कि लोग यहां की खूबसूरती की सराहना नहीं करते हैं।
NRतुलना में कम है++c
आप विम की अपनी खोज और स्थानापन्न क्षमताओं का उपयोग कर सकते हैं जैसे: अपना कर्सर पहली पंक्ति में रखें, और सामान्य मोड में टाइप करें:
:.,/fff/s/\n.*\(\n.*\)/\1/g
.,/fff/प्रतिस्थापन के लिए सीमा है। इसका मतलब है "इस रेखा से उस रेखा से जो रेग्ज से मेल खाती है fff(इस मामले में, अंतिम पंक्ति)।s///स्थानापन्न कमांड है। यह एक रेगेक्स की तलाश करता है और इसकी हर घटना को एक स्ट्रिंग के साथ बदल देता है। gअंत का मतलब है पर जब तक regex पाए जाने रहता प्रतिस्थापन को दोहराने के लिए।\n.*\(\n.*\)एक नई रेखा से .*मेल खाता है , फिर एक पूरी पंक्ति (एक नई पंक्ति को छोड़कर किसी भी वर्ण से मेल खाती है), फिर एक अन्य पंक्ति और दूसरी पंक्ति। कोष्ठक \(और \)उनके अंदर की अभिव्यक्ति को दर्ज करने का कारण बनता है, इसलिए हम बाद में इसका उपयोग कर सकते हैं\1 ।\1 समूहीकृत न्यूलाइन और उसके बाद की लाइन को सम्मिलित करता है, क्योंकि हम नहीं चाहते कि अगली पंक्ति भी चले - हम बस चाहते हैं कि प्रतिस्थापन तंत्र इसके पास से गुजरे ताकि हम इसे अगले प्रतिस्थापन में न हटाएं।इस तरह आप उस सीमा को नियंत्रित कर सकते हैं जिसमें आप विलोपन करना चाहते हैं, और आपको किसी बाहरी उपकरण का उपयोग करने की आवश्यकता नहीं है।
$के बजाय /fff/, अंत फ़ाइल फ़ाइल की सामग्री की परवाह किए बिना के लिए।
एक अन्य दृष्टिकोण के रूप में आप भी अजगर का उपयोग कर सकते हैं यदि आपके विम के पास इसके लिए समर्थन है।
:py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2]
b = cb[:]वर्तमान बफर में सभी लाइनों को अस्थायी रूप से कॉपी करता है b। b[::2]बफर से हर दूसरी लाइन प्राप्त करता है और इसे पूरे वर्तमान बफर को असाइन करता है cb[:]। प्रतिलिपि bआवश्यक है क्योंकि बफर ऑब्जेक्ट विस्तारित स्लाइस सिंटैक्स का समर्थन नहीं करते हैं।
यह शायद "विम तरीका" नहीं है, लेकिन अगर आप अजगर जानते हैं तो याद रखना आसान हो सकता है।
विषम पंक्तियों (1,3,5, ..) को हटाने के लिए -> :%s/\(.*\)\n\(.*\)\n/\2\r/g
यहां तक कि लाइनों को हटाने के लिए (2,4,6, ..) -> :%s/\(.*\)\n.*\n/\1\r/g
पाठ के लिए खोजें (पहली पंक्ति के रूप में) एक नई पंक्ति के चरित्र के बाद और कुछ और पाठ (दूसरी पंक्ति के रूप में) के बाद एक और नई पंक्ति का चरित्र और ऊपर या तो पहले मैच (विषम रेखा) या दूसरे मैच (यहां तक कि रेखा) के साथ बदलें गाड़ी वापसी के बाद।
आप इस कोशिश कर सकते हैं vim में
:1,$-1g/^/+1d
मैं और अधिक स्पष्ट होने की कोशिश करूँगा (दो भाग)
पहला भाग चयन सीमा ( :from,to)
दूसरा भाग क्रिया ( dहटाएं)
:1,$-1 ) तकg) हटाएँ ( +1d) अगली पंक्तिआप अपनी फ़ाइल की पहली पंक्ति में जाने का प्रयास कर सकते हैं और निष्पादित :+1dकर पाएंगे और अगली पंक्ति गायब हो जाएगी
मुझे पता है कि यह मैला है, लेकिन यह विम है और यह काम करता है