गैर-संवादात्मक (जैसे पाइपलाइन में) फ़ाइलों को कैसे संपादित करें?


24

मैं गैर-संवादात्मक तरीके से विम का उपयोग करके पाइपलाइन इनपुट में पारित फ़ाइलों को संपादित करना चाहता हूं या फाइलों को इन-प्लेस (इसी तरह sed) संपादित करना चाहता हूं ।

कुछ उदाहरणों का उपयोग करते हुए sed:

$ sed -i'.bak' s/foo/test/g file   # Edit file in-place.
$ cat file | sed s/foo/test/g      # Parse file in pipeline.

हालाँकि मैं यहाँ पढ़ सकता था , कि:

sedएक है एस tream प्रवर्तन निदेशालय itor, न कि एक फ़ाइल संपादक। फिर भी, हर जगह लोग फ़ाइलों को संपादित करने की कोशिश के लिए इसका दुरुपयोग करते हैं। यह फ़ाइलों को संपादित नहीं करता है।

दूसरा कुछ विकल्प जैसे कि इन-प्लेस एडिटिंग ( -i) पोर्टेबल है।

विम में समान कार्यक्षमता कैसे प्राप्त की जा सकती है?


मुझे लगता है कि आप fileअपने दूसरे कमांडलाइन से दूसरा गिरा सकते हैं ।
joeytwiddle

@joeytwiddle किया।
केनोरब

जवाबों:


33

फ़ाइल को गैर-अंतःक्रियात्मक रूप से उपयोग करने के लिए संपादित करने के लिए ex( viयह दृश्य विधा है ex), आप पहले फ़ाइल के पढ़ने के बाद vi कमांड को निष्पादित करने की अनुमति दे सकते हैं +{command}या उपयोग कर सकते -c {command}हैं।

exएक मानक कमांड लाइन (के समान संपादक है ed)।

वहाँ भी है vipe(एक विम कमांड पाइप संपादक) का उपयोग किया जाना चाहिए जो moreutilsपैकेज का हिस्सा है और यह आपको अपने संपादक को यूनिक्स पाइप लाइन के बीच में चलाने और प्रोग्राम के बीच पाइप किए जाने वाले डेटा को संपादित करने की अनुमति देगा।

उदाहरण

सरल मानक इनपुट और पाइप का उपयोग करके आउटपुट इस शेल सिंटैक्स द्वारा प्राप्त किया जा सकता है:

$ ex -sc'%p|q!' <(echo Example)
$ echo Example | ex -sc'%p|q!' /dev/stdin

प्रतिस्थापन के बाद फ़ाइल को कैसे प्रिंट करें इसका सरल उदाहरण यहां दिया गया है:

$ ex /etc/hosts +%s/127/128/ge -sc'%p|q!'

फ़ाइलों को जगह में संपादित करने के लिए और उदाहरण:

$ ex +'%s/127/128/g' -cswq file
$ ex -sc '%s/olddomain\.com/newdomain.com/g|x' file
$ printf '%s\n' 'g/olddomain\.com/s//newdomain.com/g' w q | ex -s file
$ ex -s "$file" <<< $'g/old/s//new/g\nw\nq'
$ ex -sc 'argdo %s/old/new/ge|x' ./**
$ find . -type f -exec ex -sc '%s/old/new/g|x' {} \;

आप भी उपयोग कर सकते हैं -s {scriptin}ताकि कमांड फ़ाइल से लोड हो, उदाहरण के लिए:

$ printf "%s\n" '%s/foo/test/ge' 'wq' > cmds.vim
$ vim -s cmds.vim -es file

या I / O पुनर्निर्देशन का उपयोग कर:

$ vim file < cmds.vim

एक फ़ाइल को संपादित करने और परिवर्तनों को दूसरे में सहेजने के लिए, निम्न उदाहरण देखें:

$ ex +%s/127/128/g -sc'wq! new_file' /etc/hosts
$ cat /etc/hosts /etc/fstab | vim - -es '+:%s/foo/test/g' '+:wq! file3'

अधिक व्यावहारिक उदाहरण।

RPM विनिर्देशन से वास्तविक उदाहरण

vim -E -s Makefile <<-EOF
   :%substitute/CFLAGS = -g$/CFLAGS =-fPIC -DPIC -g/
   :%substitute/CFLAGS =$/CFLAGS =-fPIC -DPIC/
   :%substitute/ADAFLAGS =$/ADAFLAGS =-fPIC -DPIC/
   :update
   :quit
EOF

HTML टैग निकालना :

ex -s +'bufdo!/<div.*id=.the_div_id/norm nvatdggdG"2p' +'bufdo!%p' -cqa! *.html

XML टैग हटा रहा है :

ex -s +'%s/<[^>].\{-}>//ge' +%p +q! file.txt

हेडर से स्टाइल टैग हटाना और पार्स किए गए आउटपुट को प्रिंट करना:

curl -s http://example.com/ | ex -s +'/<style.*/norm nvatd' +%p -cq! /dev/stdin

कई जटिल नियमों के साथ पार्स html :

ex -V1 $PAGE <<-EOF
  " Correcting missing protocol, see: https://github.com/wkhtmltopdf/wkhtmltopdf/issues/2359 "
  %s,'//,'http://,ge
  %s,"//,"http://,ge
  " Correcting relative paths, see: https://github.com/wkhtmltopdf/wkhtmltopdf/issues/2359 "
  %s,[^,]\zs'/\ze[^>],'http://www.example.com/,ge
  %s,[^,]\zs"/\ze[^>],"http://www.example.com/,ge
  " Remove the margin on the left of the main block. "
  %s/id="doc_container"/id="doc_container" style="min-width:0px;margin-left : 0px;"/g
  %s/<div class="outer_page/<div style="margin: 0px;" class="outer_page/g
  " Remove useless html elements. "
  /<div.*id="global_header"/norm nvatd
  wq " Update changes and quit.
EOF

और भी उदाहरण:


यह भी देखें:



5
यह एक UUOC है ; vim '+:0,$s/foo/test/g' '+:wq! file2' file1इसके बजाय बस का उपयोग करें ।
डोरकनॉब

2
ध्यान दें कि इनमें से कम से कम कुछ उदाहरण उदाहरण के लिए, POSIX- अनुरूप नहीं हैं bufdo। भले ही विम को हर जगह लगभग स्थापित किया गया है, यह जानने के लायक है कि आप केवल POSIX- संगत सुविधाओं का उपयोग करके फ़ाइल संपादन स्क्रिप्ट कर सकते हैंex
वाइल्डकार्ड

इस प्रश्न और उत्तर ने मुझे पहले देखने exऔर वास्तव में इसे सीखने के लिए प्रेरित किया। धन्यवाद। इस विषय पर कुछ और पढ़ने (पूर्ण प्रकटीकरण: मैंने ये लिखा है;) है: हर चार पंक्तियों को उल्टा करनाex , और विकल्प का उपयोग करना-c । यदि आप चाहें तो आप उन्हें अपनी लिंक सूची में जोड़ सकते हैं। :)
वाइल्डकार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.