コマンドラインから標準出力にバッファ全体を書き込む方法は?


10

バッファ全体を/dev/stdoutファイルではなく標準出力()に書き込みたいのですが、次のコマンドはファイルの編集中に期待どおりに機能します。

:w >> /dev/stdout

ヒント:Control+ Lを押して画面を更新します。

しかし、コマンドラインから(非対話的に)同じことを行おうとすると、期待どおりに機能しません。たとえば、次のようになります。

$ echo This is example. | vim - '+:w >> /dev/stdout' '+:q!'
Vim: Reading from stdin...

同じ:w !tee:x! /dev/stdout:%printおよび同様。

終了する前に、それは言っています:[Device] 1L, 17C appended

パイプの途中でvimに標準入力を標準出力に強制的に書き込む方法はありますか?多分それは何とか緩衝されていますか?


4
好奇心旺盛、何を成し遂げようとしているのですか?のように、他のツールでできないvimはここで何をしますか?
Jay Thompson

1
@JayThompson vim代わりにファイル解析に使用しようとしていますsed(たとえば、複数の大きなファイルへの複雑な変更を大量に繰り返した場合)。この例では、単純にするために何も実行せず、別の投稿の潜在的な複製を作成しません。
ケノーブ2015

vipeについて知っているので、それを使用しない理由はありますか?
muru

@muru私はまだそれを使用していませんでした。利用可能なドキュメントがあまりなく、ここではトピックから外れています。
ケノーブ2015

vipeについての質問もあるかもしれませんが、それが答えにならない理由はありません。なぜ私はそれを答えとして投稿すべきではないのかと思っています。
muru

回答:


9

バッファーをシェルの標準出力に出力するにvimは、Exモードで開始する必要があります。そうしないと、独自のウィンドウで「通常」の方法で開き、終了時に出力バッファーをクリアします。

最も簡単な作業例は次のとおりです。

$ echo foo | vim -e '+%print' '+q!' /dev/stdin
foo

またはさらに短い:

$ echo foo | ex +%p -cq! /dev/stdin
$ echo foo | ex +"%p|q!" /dev/stdin

注:コマンドvim -eは基本的にコマンドと同等exです。

/dev/stdin(以下で説明するように)余分な迷惑なメッセージを防ぐために、標準入力への特別なファイル記述子を指定する必要があります()。


そして、ここに文字列を解析するいくつかの例があります:

$ echo This is example. | vim -e '+s/example/test/g' '+%print' '+q!' /dev/stdin
This is test.
$ echo This is example. | vim - -es '+s/example/test/g' '+%print' '+q!'
Vim: Reading from stdin...
This is test.

注:最後の例は、ファイル全体をメモリに読み込み、標準入力から読み込まれたと言う標準的な戦略のため、非表示にすることができない余分な迷惑なメッセージを示しています。最初の例はメッセージなしで機能します。これは、ファイルがファイルの終わり(EOF)信号なしで無限のデータを生成するため、入力読み取りの終わりに到達しないためです。


関連:


1
あなたは、+q!ではなく、単に行うことができ+:q!ますよね?
アンドリュー、

@AndrewMacFie同じことです。更新しました。ありがとう。
kenorb 2017

3

vipeは、moreutilsパッケージの一部であるパイプラインを編集するための便利なツールです。これは、エディターのラッパーです(vi名前を付けるものを含む)。EDITOR環境変数を使用してエディターを設定します。そのため、EDITOR(、などの)を利用する他のツールと同様crontabvisudo、その変数を使用してアクションをスクリプト化できます。たとえば、次のように変更できます。

$ echo foo | EDITOR='vim +:s/foo/bar/ +wq' vipe | tail
bar

もちろん、複雑なアクションは地獄を引用することになるので、スクリプトを書くことができます。

#! /bin/sh

vim "+:s/foo/bar" '+wq' "$@"

そしてを使用しますEDITOR="sh /path/to/script"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.