VIM を使用してテキスト ファイル内の特定の文字列を検索するにはどうすればよいですか? 検索文字列のインスタンスを含むすべての行を出力しますか?
お知らせ下さい。
ありがとう!
Vim の組み込みglobal
ツールを使用できます。ウィンドウの下部にすべての一致の行が出力されます。これの例は次のとおりです。:g/searchterm/Enter
ファイル内のどこに一致するかを把握するために、まだ有効になっていない場合は、行番号を有効にすると役立つ場合があります。これを行うコマンドは次のとおりです。:set numberEnter
次のコマンドを実行すると、追加情報が表示されます。:help globalEnter
編集:
結果を独自のウィンドウにリダイレクトする場合はvim.wikia.com
、コマンド シーケンスの使用をお勧めします
:redir @a redirect output to register a
:g// repeat last global command
:redir END end redirection
:new create new window
:put! a paste register a into new window
これは vimscript として非常に簡単にスクリプト化できますfunction
。Vim 関数を適切にスクリプト化する方法を学ぶために、 Steve Losh - Learn Vimscript the Hard Wayチュートリアルを見たことがない場合は、チェックすることを強くお勧めします。
それを行う別の可能性があります:g
現在のファイルのすべての行を単語で取得したいとしますfoo
。
次のように入力できます。
qzq:g/foo/y Z
Enter
上記の行を実行した後、それらの行はレジスタに格納されますz
。"zp
どこかに貼り付けるか、後で処理することができます。
すぐに何をしますか:
qzq
z
:レジスタをクリアする
:g/foo/y Z
:一致したすべての行をヤンクして登録しますz
:g[lobal]
マイクの回答のコマンドに加えて、いくつかの代替手段があります。
:il[ist] foo
現在のバッファ内のfoo
コメントのように見えない行を含むすべての行を一覧表示します(:il[ist]!
コメントも一致させたい場合に使用します)。
リストが表示されているとき、ヒット<CR>
してそれを消すか、またはヒット:
して Ex コマンドを発行できます::5<CR>
行 5 にジャンプし、:5t3
行 3 の後に行 5 をコピーするなど。
リストは一時的なものであることに注意してください。そのリストをもう一度表示したい場合は、コマンドを再発行する必要があります。
使用法:
:il foo<CR>
:23<CR>
:vim[grep] bar % | cw[indow]
bar
現在のバッファに含まれるすべての行をクイックフィックス ウィンドウに取り込みます。
:h quickfix
それを使用する方法を知るために読んでください。すばやく、ヒット<CR>
して結果:cn
にジャンプ、次の結果:cp
にジャンプ、前の結果にジャンプ…</p>
使用法:
:vim bar % | cw<CR>
(navigate to the result you want in the quickfix window
with arrows, `jk`, line numbers, search…)
<CR>
Vim の internal のようなメソッドの代わりに:grep bar % | cw[indow]
、システムの which を使用することもできます。grep
grep
クイックフィックス ウィンドウの内容は、エラー リストを操作する次のコマンド:vim
または:grep
その他のコマンドまで変更されないことに注意してください。:make
これは、クイックフィックス ウィンドウを非表示にして、同じリストで再び開くことができることを意味します。
たとえば、「qqq」を検索した後、次のコマンドでその文字列を含む行のみが表示されます。
:v//d
"v"は前の検索 ("//")を含まない行に一致し、"d" はそれらを削除します。マイナスの「g」です。
必要な線だけがきれいに表示されます。特定のものに興味がある場合は、「mm」とマークします。
それらを表示し終わったら、「u」を使用して削除を元に戻し、ファイルを元に戻します (忘れる必要はありません)。
その後、「n」でそれらの行間を移動するか、「'm」でマークされた行に移動します。