Etkileşimli olmayan dosyalar nasıl düzenlenir (örneğin, boru hattında)?


24

Vim kullanarak boru hattı girişinde geçirilen dosyaları etkileşimli olmayan şekilde düzenlemek veya dosyaları yerinde (benzer şekilde sed) düzenlemek istiyorum.

Birkaç örnek kullanarak sed:

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

Ancak burada şunu okuyabilirdim :

sedBir S düzenleyici ED itor , bir dosya editörü değil. Bununla birlikte, her yerdeki insanlar dosyaları düzenlemeyi denedikleri için kötüye kullanma eğilimindedir. Dosyaları düzenlemiyor.

İkincisi, yerinde düzenleme ( -i) gibi bazı seçenekler taşınabilir.

Vim'de aynı işlevsellik nasıl elde edilebilir?


Sanırım fileikinciyi ikinci komut satırından düşürebilirsin .
joeytwiddle

@joeytwiddle Tamamlandı.
kenorb

Yanıtlar:


33

Olmayan etkileşimli kullanarak düzenlemek dosyası için ex( vigörsel modu ise ex), kullanabilirsiniz +{command}veya -c {command}ilk dosya okuma olmuştur sonra vi komutları çalıştırmak için izin veren parametreleri.

ex(E benzer bir standart bir komut satırı editörü ed).

Ayrıca paketin bir vipeparçası olan (bir Vim komut satırı düzenleyicisi) kullanılmalıdır moreutilsve editörünüzü bir unix boru hattının ortasında çalıştırmanıza ve programlar arasında aktarılan verileri düzenlemenize izin verir.

Örnekler

Bu kabuk sözdizimi ile basit standart girdi ve boru kullanarak çıktı elde edilebilir:

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

İşte değiştirmeden sonra dosyayı nasıl basacağınızı gösteren basit bir örnek:

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

Dosyaları yerinde düzenlemek için daha fazla örnek:

$ 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' {} \;

Ayrıca -s {scriptin}komutların dosyadan yüklenmesi için de kullanabilirsiniz , örneğin:

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

veya G / Ç yönlendirmesini kullanarak:

$ vim file < cmds.vim

Bir dosyayı düzenlemek ve değişiklikleri diğerine kaydetmek için aşağıdaki örnekleri kontrol edin:

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

Daha pratik örnekler

Gerçek canlı örneği dan RPM şartname:

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 etiketleri ayıklanıyor :

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

XML etiketlerini kaldırma :

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

Stil etiketini başlıktan kaldırmak ve ayrıştırılan çıktıyı yazdırmak:

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

Birden çok karmaşık kuralla html'yi ayrıştırın :

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

Daha da fazla örnek:


Ayrıca bakınız:



5
Bu bir UUOC ; sadece vim '+:0,$s/foo/test/g' '+:wq! file2' file1onun yerine kullanın.
Doorknob

2
Örneğin, bu örneklerden en azından birisinin POSIX uyumlu olmadığını unutmayın bufdo. Neredeyse her yere kurulmuş olan Vim olsa da, yalnızca POSIX uyumlu özelliklerini kullanarak dosya düzenlemeyi komut dosyası yapabileceğinizi bilmek önemlidir . ex
Joker

Bu soru-cevap ilk önce araştırmam exve gerçekten öğrenmem için bana ilham verdi. Teşekkür ederim. Bu konuyla ilgili bazı okumalar (tam açıklama: Bunları yazdım;) şu şekildedirex : her dört çizgiyi de tersine çevirmek ve seçeneği kullanmak-c . İsterseniz, onları alttaki bağlantı listenize ekleyebilirsiniz. :)
Wildcard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.