Vi संपादक: किसी फ़ाइल में कई पंक्तियों को हटाने का सबसे तेज़ तरीका क्या है?


12

मैं एक फ़ाइल में कई पंक्तियों को हटाने के लिए Vi संपादक का उपयोग करना चाहूंगा। कृपया मुझे विचार या सुझाव दें।

मेरा लक्ष्य इस तरह है:

इससे पहले:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.
.
29
30
.
.

उपरांत;

1
10
20
30
40
.
.

3
हटाने के लिए आपने पंक्तियों को कैसे चुना? क्या आप हर 10 में एक पंक्ति छोड़ना चाहते हैं?
मटेरज़ी

1
आप लाइनों की सीमाओं को हटा सकते हैं :[range]dउदाहरण के लिए :3,5dपांच (समावेशी) के माध्यम से तीन लाइनों को हटाता है।
ब्राचली


@ आर केतकेवु - क्या आप संख्याओं की सूची निकालने की कोशिश कर रहे हैं या वे पंक्तियाँ हैं? क्या आप कृपया अपना प्रश्न स्पष्ट करने के लिए अद्यतन कर सकते हैं?
DarkHeart

मैं तुम्हें Vi के बारे में पूछ रहे हैं पता है, लेकिन आप भी, जीएनयू Sed के साथ क्या कर सकते हैं:gsed -n '1p; 0~10p'
shadowtalker

जवाबों:


17

यदि आपका मतलब है कि आप हर 10 वीं पंक्ति को रखना चाहते हैं और बाकी को हटा दें:

%norm 9ddj

स्पष्टीकरण:

% पूरी फ़ाइल

norm "सामान्य मोड" में निम्न कमांड निष्पादित करें

9dd 9 लाइनें हटाएं

j एक पंक्ति नीचे ले जाएँ (यानी इसे रखें)

नोट: यह पहली पंक्ति को हटाता है।

Http://www.rayninfo.co.uk/vimtips.html से अनुकूलित


या वैश्विक कमांड का उपयोग कर:

  • पहली पंक्ति को डुप्लिकेट करें ggYP
  • :g/^/+ d9

Https://stackoverflow.com/questions/1946738/vim-how-to-delete-every-second-row से अनुकूलित


या आप उपयोग कर सकते हैं awk:

%!awk 'NR \% 10 == 0 || NR == 1'

Awk कमांड मेरे लिए काम करती है। मैं हमेशा सोचा था कि awk को न्यूनतम एक ब्लॉक की आवश्यकता थी {...}। आपको पता नहीं अच्छा है यह पहला गैर-तुच्छ awk कमांड है जिसे मैंने काम किया है!
The_velour_fog

1
@the_velour_fog ब्लॉक की आवश्यकता है। यदि आप एक नहीं लिखते हैं, तो AWK ऐसा व्यवहार करेगा जैसे आपने लिखा था{ print $0 }
छायाकार

@RKetkaew आपने किन विकल्पों का उपयोग किया? यदि कोई प्रतिक्रिया आपके प्रश्न को हल करती है, तो उत्तर के रूप में चिह्नित करने के लिए कृपया टिक पर क्लिक करें।
अंडरस्कोर_ड

@underscore_d हाय, मैंने डार्कहार्ट से सुझाई गई एक कमांड का उपयोग किया। आपकी टिप्पणीयों के लिए धन्यवाद।
१६:१६

12
:2,$v/0$/d

उन लाइनों को हटा देता 0है जो दूसरे से शुरू करने में समाप्त नहीं होती हैं ।


2
यह, यह चतुर उपाय है। मैं सिर्फ एक व्याख्या यह है कि जोड़ना होगा 2,$रेंज है, और आदेश। रेगेक्स और पूर्व कमांड कहां है जो सभी लाइनों पर चलाया जाएगा जो मेल नहीं खाते हैं। v/0$/dg!0$d
grochmal
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.