非インタラクティブにファイルを編集する方法(パイプラインなど)


24

パイプライン入力で渡されたファイルを非インタラクティブな方法でvimを使用して編集するか、インプレースでファイルを編集します(と同様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あるS tream ED itor、ないファイルエディタが。それにもかかわらず、どこでも人々はファイルを編集しようとするためにそれを乱用する傾向があります。ファイルは編集しません。

次に、インプレース編集(-i)などの一部のオプションは移植可能です。

vimで同じ機能をどのように実現できますか?


file2番目のコマンドラインから2番目を削除できると思います。
joeytwiddle

@joeytwiddleできました。
ケノーブ

回答:


33

非対話的に使用して編集ファイルにexviのためのビジュアルモードがあるex)は、使用することができます+{command}または-c {command}最初のファイルが読み込まれた後、あなたがviのコマンドを実行することを可能にするパラメータ。

ex(に似た標準のコマンドラインエディタですed)。

ありますvipeの一部である使用されるべきである(Vimのコマンドパイプエディタ)moreutilsパッケージと、それはあなたがUnixのパイプラインや編集の途中でプログラム間でパイプされているデータを、あなたのエディタを実行することができますが。

パイプを使用した単純な標準入出力は、次のシェル構文によって実現できます。

$ 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

1つのファイルを編集し、変更を別のファイルに保存するには、次の例を確認します。

$ 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。Vimは事実上すべての場所にインストールされますが、POSIX準拠の機能exのみを使用してスクリプトを編集できることを知っておく価値があります。
ワイルドカード

この質問と回答は、私が最初にexそれを調べて本当に学ぶようになったきっかけです。ありがとうございました。この件に関する詳細な説明(完全な開示:私はこれらを書きました;)は次のとおりです:で4行ごとに反転exし、-cオプション使用します。必要に応じて、下部のリンクリストに追加できます。:)
ワイルドカード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.