grep検索の結果を新しいviファイルにパイプする方法


63

私はgrep -e Peugeot -e PeuGeot carlist.txtcarlist.txtを検索していくつかのアイテムを引き出すgrep -e Peugeot -e PeuGeot carlist.txt | viために使用していますが、それが私のためにそれをパイプするだろうと推測しましたが、これは私が得るものです:

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.

ファイルに含める場合は、まずファイルでviを使用し、次に:を使用し :read !grep -e Peugeot -e PeuGeot carlist.txtます。:read !cmd...cmd ...の出力をファイルに(カーソルの位置で)含める
Olivier Dulac

「viファイル」の意味が明確ではありません。出力をファイルに保存する場合は、を使用しますgrep ... > /tmp/foo&& vi /tmp/fooそのファイルをすぐに編集する場合は、最後に追加できます。
LarsH

1
実際、「viファイル」のようなものはありません。vi任意のテキストファイルで動作します。ファイル自体はに直接関連付けられていませんvi。(または、私は学んだように、vi -原因となりますviの内容を操作するためにstdinvimこれを行いますが、のではないすべてのバージョンvi。DO)
キース・トンプソン

回答:


111

'-'を引数としてviまたはvimを実行すると、標準入力から編集するファイルが読み取られます。したがって:

grep -e Peugeot -e PeuGeot carlist.txt | vi -

必要なことを行います。


3
これを見ている人には、注意:から期待していstdinます。いくつかのケースでは、あなたからリダイレクトする必要がありますstderrstdin、例えば:valgrind my_file.out 2>&1 | vi -
チロコスタ

これは、検索highlightings削除
MDを。モヒウディンアーメド

3
@ MD.MohiuddinAhmed、どのように維持することを期待していますgrepVimの内の(印字不可能な文字で構成)の検索着色を?あなたはいつもちょうど検索を行うことができますのVim。
ワイルドカード

vim内でvim.org/scripts/script.php?script_id=302プラグインを使用できると思った。
MD。モヒウディンアーメド

11

出力リダイレクトを使用する必要があります。

grep ... > newfile.txt && vi newfile.txt

また、私はあなたgrepが改善できると思います:

grep 'Peu[gG]eot' carlist.txt > newfile.txt && vi newfile.txt


5

出力リダイレクトも次のように使用できます。

vi <(grep ...)

複数のコマンド出力でも、個別のファイルに保存されているかのようにリダイレクトできます。

vim -d <(ls) <(ls -a)

1

~/bin/r

#!/bin/sh
[ $# -eq 0 ] && set -- -;
exec vi -R "$@"

~/.vimrc

:  au StdinReadPost * set buftype=nofile

次に:

ls |r
grep -e Peugeot -e PeuGeot carlist.txt | r

そして私は持っています

r- () { "$@" | r; }

私の~/.bashrc,ように

r- ls -l

0

vi(m)内でも、vi(m)の外でも、必要なことを行うための多くの効果的な方法があります。

コマンドを実行し、(一時)ファイルを作成してから、ファイルを編集します(Joseph R.の回答を参照

grep -e"Peu[gG]eot" carlist.txt && vi /tmp/peugeot.txt

コマンドを(バックグラウンドで)実行して一時ファイルを作成し、「:e!」を使用してファイルを編集します。生成されたファイルを更新する(これはログファイルや、cronなどの別のプロセスで生成される他のファイルに役立ちます)。

grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt &
vi /tmp/peugeot.txt

vi(m)を実行し、子プロセスを実行して一時ファイルを作成してから読み取り、

vi
:!grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt
:r /tmp/peugeot.txt

または、ファイルに切り替えるだけで、

:e /tmp/peugeot.txt

vi(m)を実行し、ダブルバング「!!」を使用します viに子コマンドを実行させ、結果を取得して現在の場所に挿入します(現在の行を上書きするため、空白行があることを確認してください)。

vi
i
here
empty
there
<esc>
kk
!!grep -e "Peu[gG]eot" carlist.txt

これで、ファイルを(必要に応じて)任意のファイル名に書き込むことができます。

:w /tmp/someotherfilename.txt

そして、ペトル・ウーゼルの答えも良いです、

grep -e "Peu[gG]eot" carlist.txt | vi -

stdinから読み取る

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