Unixパイプライン内でvimを使用するにはどうすればよいですか?

Aug 20 2020

次の呼び出しを使用して、vim / exを使用してファイルをgrepできます。

ex -c'g/foo/p' -cq -s afile.txt

同様のコマンドを使用して、stdinからいくつかのテキストをgrepしたいと思います。次のコマンドは機能するはずだと思いましたが、出力が生成されません。

cat afile.txt | ex -c'g/foo/p' -cq -s -

vim -e代わりに使用した場合も同じことが起こりますex

cat test.md | vim -e -c'g/foo/p' -cq -s -

exに初期バッファをstdinから読み取り、出力をstdoutに出力して、Unixパイプライン内で使用できるようにする方法はありますか?

回答

4 user938271 Aug 21 2020 at 02:34

特別なファイル名を-前に移動します-e

cat test.md | vim -e -c'g/foo/p' -cq -s -
                                        ^
                                        ✘

cat test.md | vim - -e -c'g/foo/p' -cq -s
                  ^
                  ✔

の前に-e-リテラルテキストとして読み取られます。の後-e-Exコマンドとして読み取られます。


Vim: Reading from stdin...警告を抑制するには--not-a-termvim(1)次のコマンドに引数を渡します。

cat test.md | vim - -e -c'g/foo/p' -cq -s --not-a-term
                                          ^----------^

Vimを終了する:qa!には、次の代わりに実行します:q

cat test.md | vim - -e -c'g/foo/p' +'qa!' -s --not-a-term
                                     ^-^

あなたは参加することができます-e-s、あなたは置き換えることができ-c+

cat test.md | vim - -es +'g/foo/p' +'qa!' --not-a-term
                      ^ ^

これで、Vimの出力を別のシェルユーティリティに渡すことができるはずです。例wc(1)

cat test.md | vim - -es +'g/foo/p' +'qa!' --not-a-term | wc -l
                                                       ^-----^

参照:

  • vims
  • パイプラインフィルタリング用のVim
  • Vimの社会生活
  • 私のノート