मैं vi का उपयोग करके किसी फ़ाइल में सभी पंक्तियों को कैसे हटा सकता हूं?


269

मैं vi का उपयोग करके किसी फ़ाइल में सभी पंक्तियों को कैसे हटा सकता हूं?

फिलहाल मैं एक फाइल में सभी लाइनों को हटाने के लिए इस तरह का उपयोग कर रहा हूं:

echo > test.txt

मैं सभी लाइनों का उपयोग करके कैसे हटा सकता हूं vi?

नोट: उपयोग करना ddएक अच्छा विकल्प नहीं है। कई लाइनें हो सकती हैं।


5
मुझे लगता है कि डीजी को काम करना चाहिए।
मैडक्स

11
@ मेडटक्स, केवल अगर आप पहली पंक्ति पर शुरू करते हैं। 1GdGकहीं से भी काम करेंगे।
होलोले

1
echo | test.txtएक मान्य कमांड नहीं test.txtहै , जब तक कि एक निष्पादन योग्य स्क्रिप्ट नहीं है। मैं तुम्हारे echo >test.txtबजाय अनुमान लगा रहा हूँ ?
ट्रिपलए

आप सही हैं @tripleee
कोल्ड

5
ध्यान दें कि उपयोग नहीं किया जा रहा है vi, >test.txtयह शून्य लंबाई तक काट करने के लिए पर्याप्त है - कोई echoज़रूरत नहीं है।
abligh

जवाबों:


473

में viकरते हैं

:1,$d

सभी लाइनों को हटाने के लिए।

:एक कमांड का परिचय देता है (और कर्सर को नीचे की ओर ले जाता है)।
इस 1,$बात का संकेत है कि निम्न कमांड ( d) पर काम करना चाहिए। इस स्थिति में लाइन एक से अंतिम पंक्ति तक (संकेत द्वारा $, ताकि आपको दस्तावेज़ में लाइनों की संख्या जानने की आवश्यकता न हो)।
अंतिम dसंकेतित लाइनों को हटाने के लिए खड़ा है।

एक छोटा रूप है ( :%d), लेकिन मुझे लगता है कि इसका उपयोग कभी नहीं किया गया। :1,$dऔर अधिक आसानी से किया जा सकता है "अनुकूलित" जैसे को :4,$-2dकेवल पहले 3 और पिछले 2 लाइनों छोड़ रहा है, बाकी को हटाने।


9
प्रो टिप। और नहींESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
rdev5

2
@ rdev5 .अगली बार एक कमांड दोहराने की कोशिश करें
गाज़ीहान अलंकुस

169

Vi में मैं उपयोग करता हूं

:%d

कहाँ पे

  • : vi को कमांड मोड में जाने के लिए कहता है
  • % सभी लाइनों का मतलब है
  • d : हटाओ

कमांड लाइन पर,

> test.txt

भी करेंगे।

Dd को क्या समस्या है?

dd if=/dev/null of=test.txt

कहाँ पे

  • /dev/null एक विशेष 0 बाइट फ़ाइल है
  • if इनपुट फ़ाइल है
  • of ouput फ़ाइल है

मैं सोच रहा था कि ddफाइल पर हर लाइन के लिए मुझे pess की जरूरत है।
कोल्ड

अच्छा। यह मेरी अपेक्षा से अधिक सरल है ...
कोल्ड

11
आपको ddvi कमांड (जिसे ओपी का मतलब है) और ddउपयोगिता के बीच अंतर करने की आवश्यकता है , जिसका आप उदाहरण देते हैं। इसके अलावा, > test.txtगैर-बैश शेल (जैसे zsh) में अपेक्षित रूप से काम नहीं हो सकता है।
depquid

1
@ डिडक्विड ओट्स! अब मैं इसके बारे में सोचता हूँ ...
आर्कमेयर

2
या : >test.txtजो केवल बहुत कम समय के लिए है।
त्रिवेणी

53

मेरा सुझाव है कि आप ऐसा करें (किसी भी POSIX- अनुरूप शेल में काम करना चाहिए):

> test.txt

यदि आप वास्तव में इसे vi के साथ करना चाहते हैं, तो आप कर सकते हैं:

  • 1G (पहली पंक्ति पर जाएं)
  • dG (अंतिम पंक्ति में हटाएं)

30
@ कॉल्ड: ... एक बार?
क्रिस डाउन

5
Gअंतिम पंक्ति का प्रतिनिधित्व करता है। यदि आप पहली पंक्ति पर हैं ( gg), dGvi को वर्तमान रेखा (पहली पंक्ति) से अंतिम पंक्ति तक की सभी पंक्तियों को हटाने के लिए कहता है। तो, आप इसे एक शॉट में करते हैं।
unxnut

6
ggविशिष्ट है। यह 1Gपारंपरिक vi में है।
स्टीफन चेज़लस

1
आपका शेल सिंटैक्स कुछ शेल के लिए कॉन्फ़िगरेशन पर निर्भर है। दोनों bash और zsh (डिफ़ॉल्ट रूप से zsh) इंटरैक्टिव गोले उस आदेश को प्राप्त करने के बाद STDIN पर इनपुट की प्रतीक्षा कर सकते हैं और फ़ाइल को वास्तव में साफ़ करने के लिए एक अतिरिक्त <CTRL> + D आवश्यक है। चलाने की क्षमता भी CLOBBER सेटिंग्स पर निर्भर है। >| test.txt < /dev/nullयह कुछ हद तक अधिक मजबूत है क्योंकि यह हमेशा फ़ाइल को क्लॉबर करेगा और इंटरेक्टिव टर्मिनलों पर इनपुट की प्रतीक्षा करने से बचें।
कालेब

1
@ कालेब: जैसा मैंने कहा, किसी भी POSIX- आज्ञाकारी खोल में। :-) न तो उन दो स्थितियों में POSIX- शिकायत है।
क्रिस डाउन

28

यदि आपका कर्सर पहली पंक्ति पर है (यदि नहीं, टाइप करें: ggया 1G), तो आप बस उपयोग कर सकते हैं dG। यह वर्तमान लाइन से फ़ाइल के अंत तक सभी लाइनों को हटा देगा। इसलिए यह सुनिश्चित करने के लिए कि आप फ़ाइल से सभी लाइनों को हटा देंगे, आप दोनों को एक साथ मिला सकते हैं, जो होगा: ggdG(कमांड मोड में)।

या %dपूर्व मोड में, कमांड-लाइन उदाहरण vim +%d foo.bar:।

संबंधित: मैं वर्तमान लाइन से फ़ाइल के अंत तक VIM सभी पाठ को कैसे हटा सकता हूं?


3
+1 से अधिक एर्गोनोमिक होने के लिए: 1, $ d। ऐसा नहीं है कि हमारी उंगलियां अब हर समय कोलन टाइप करने के लिए तार-तार नहीं होती हैं;)
हारून आर।

2
Upvoted। dGवह है जो मैं हमेशा उपयोग करता हूं।
दोपहर का भोजन 0317

1
मुझे यह ( ggdG) सबसे आसान तरीका लगता है। इस उत्तर का कारण यह नहीं है कि अन्य ggशुद्ध शून्य में मौजूद नहीं है?
थमेरा

27

मैं एक आलसी दोस्त हूं, और मैं इसे सरल रखना पसंद करता हूं। ggdGसहित पाँच कीस्ट्रोक्स हैShift

ggफ़ाइल में पहली पंक्ति में जाता है, एटल क्रिया dकी शुरुआत है dऔर Gफ़ाइल के निचले भाग में जाने के लिए आंदोलन है। मौखिक रूप से, यह फ़ाइल की शुरुआत में जाता है और टाइल के अंत तक सब कुछ हटा देता है।


rsrs। मैं आलसी भी हूं और इसका उपयोग :$dया :1,$dतेज तरीका है (मैं कम अक्षर लिखता हूं) kkk
कोल्ड

3
:%dअच्छा विकल्प है, क्योंकि आप केवल 5 कीस्ट्रोक्स का उपयोग उस तरह से भी करते हैं।
टैंकरस्मैश

1
@TankorSmash ggएक vimकमांड है, नहीं vi
कियारास

अच्छी पकड़, मेरी गलती
टैंकोरशश

12

फ़ाइल की शुरुआत में जाएं और दबाएं dG


5

मैं हमेशा उपयोग करता हूं ggVG

  • gg वर्तमान संपादन फ़ाइल की शुरुआत के लिए कूदता है
  • V(पूंजीकृत v) वर्तमान लाइन का चयन करेगा। इस मामले में वर्तमान संपादन फ़ाइल की पहली पंक्ति
  • G(पूंजीकृत जी) फ़ाइल के अंत में कूद जाएगा। इस मामले में, चूंकि मैंने पहली पंक्ति Gका चयन किया था, इसलिए इस फ़ाइल में पूरे पाठ का चयन करेंगे।

तब आप बस सभी लाइनों को दबा सकते हैं dया xहटा सकते हैं।


यदि आप dलंबवत रूप से उपयोग करते हैं , तो यह स्वचालित रूप से linewise लागू करता है। उदाहरण के लिए, एक रेखा को dlदाईं ओर djहटाता है, उदाहरण के लिए, एक पंक्ति को हटाता है।
टैंकरस्मैश

3

ध्यान दें कि आपके प्रश्न में, echo > test.txtइसमें एक एकल पंक्ति विराम वाली एक फ़ाइल बनाई गई है, न कि एक खाली फ़ाइल।

शेल से, का उपयोग करने पर विचार करें echo -n > test.txtया : > test.txt

हालांकि मैं आमतौर पर vi संपादन कमांड का उपयोग करता हूं (मैं उपयोग करता हूं ggdG), आप वर्तमान फ़ाइल के संदर्भ में शेल को भी कॉल कर सकते हैं:

:!:>%

यह लगभग के रूप में संक्षिप्त है ggdG, लेकिन टाइप करने के लिए कठिन है, और आपको यह भी पुष्टि करनी होगी कि आप संशोधित फ़ाइल को फिर से लोड करना चाहते हैं, इसलिए मैं विशेष रूप से इस मामले में इसकी अनुशंसा नहीं करता हूं, लेकिन यह जानना आवश्यक है कि वीआई से शेल कमांड का उपयोग कैसे करना है। उपयोगी।

इसे तोड़ना:

  • : एक vi आदेश आरंभ करें
  • ! एक शेल कमांड को स्थापित करें
  • : यह खाली आउटपुट के साथ शेल बिल्ड कमांड है
  • > आउटपुट को रीडायरेक्ट करें
  • % vi इसे वर्तमान फ़ाइल के नाम से प्रतिस्थापित करता है

सुझाया गया :1,$dएक अच्छा पाठ्यक्रम भी है, और बस जब मैं वहाँ हूँ, तब भी1GdG


:!:>%यह भी खतरनाक है क्योंकि viशेल के लिए फ़ाइल का नाम नहीं बचता है ( $(reboot)उदाहरण के लिए कॉल की गई फ़ाइल को संपादित करते समय ऐसा न करें )। आपको कुछ चाहिए होगा:call system(":>" . shellescape(expand("%")))
स्टीफन चेज़ेलस

3

एक और समाधान:

truncate -s 0 file

वास्तव में आसान नहीं है, >fileलेकिन ठीक है।
फक

1
एक अच्छा तरीका लगता है, लेकिन लक्ष्य vi का उपयोग करके कर रहा है। Tks
कोल्ड


-1

आप बड़ी संख्या में लाइनों को हटाने के लिए एक चाल का उपयोग कर सकते हैं। सुनिश्चित करें कि आप इन्सर्ट मोड में नहीं हैं (ESC दबाएँ) फिर 1000dd टाइप करें।


1
कमांड क्या करता है / यह कैसे काम करता है (अगली 1000 पंक्तियों को हटाता है, जो कर्सर को पहली पंक्ति में नहीं होने पर सभी लाइनों को नहीं हटाता है) पर आपको स्पष्टीकरण शामिल करना चाहिए ।
sebasth

यही कारण है कि मैं इसे एक चाल कहा जाता है :)
राडू

-1

मैं ggलाइनों के शीर्ष पर पहुंचने के लिए टाइप करता हूं और फिर ए करता हूं 100 dd। यह सूचक को संपादक की शीर्ष रेखा पर लाता है और वहां से 100 रेखाओं को साफ करता है। यदि फ़ाइल लंबी है, तो आपको अधिक पंक्तियों को जोड़ने के लिए संख्या को समायोजित करना पड़ सकता है।


-1
> file.txt

जब तक आप वास्तव में नहीं चाहते तब आपको vi खोलने की आवश्यकता नहीं है।


1
नमस्ते और यू एंड एल स्टैक एक्सचेंज साइट में आपका स्वागत है। कृपया इस साइट को सर्वोत्तम तरीके से पोस्ट करने की जानकारी के लिए सहायता केंद्र की समीक्षा करें । हम इस साइट पर जानकारीपूर्ण और अद्वितीय प्रश्नों और उत्तरों की खेती करना चाहते हैं। आपका उत्तर इस पोस्ट पर अन्य उत्तरों और टिप्पणियों के समान है। कृपया अपने पोस्ट को संपादित करें और अधिक अद्वितीय और जानकारीपूर्ण उत्तर दें। धन्यवाद!
कोमोटेप

इसके अलावा, सवाल का मुद्दा है ... "vi का उपयोग करना"
जेफ स्कॉलर

आपने जैसा सुझाव दिया, मैंने वैसा ही प्रयास किया। मुझे मिल गया bash: > file.txt: command not found
रोज़ा

@roaima आपको लगता है कि यदि आप इस चीज़ को उद्धृत करते हैं "> file.txt"
Kusalananda

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