LoginSignup
6
5

More than 5 years have passed since last update.

ある文字列をgrepで検索し返されたファイルをvimで編集

Posted at

こういう状況のこういう作業

  • 一つのディレクトリ上にいくつかのファイルがある
  • とある文字列が入っているファイルがそのうちのいくつかある
  • (その文字列自体ではなく)その文字列付近を変更したい

具体的にこういう状況のこういう作業

例えば・・・

  • homeディレクトリ上に連番(0-99)のファイルがある
  • RSAという文字列がsample{素数}.txtに入っている
  • RSAという文字列の続きは、'RSA124'とか'aaaRSAbbb'とか、そもそも小文字で'rsahoge'だったり、ばらばらとしましょう
homeディレクトリ上のファイル
$ cd ~
$ ls

sample0.txt
sample1.txt
sample2.txt
sample3.txt
sample4.txt
sample5.txt
sample6.txt
...
sample98.txt
sample99.txt

愚直にやるのであれば、grepコマンドで'RSA'文字列を検索します。

RSA文字列の検索
$ cd ~
$ grep -i RSA *

-iオプションは大文字小文字の無視(ignore)です。
(よく使うと思うので説明不要かもしれませんが、念のため)

結果は以下

grepの結果
sample2.txt:ssh-rsa
sample3.txt:aaaRSAbbb
sample5.txt:RSA124
sample7.txt:RSA125
sample11.txt:rsarsaRSA
sample13.txt:RSA5a465465a
...
sample89.txt:hogehogeRSaaaaaa
sample97.txt:RSAってなんだ

この出力結果を見ながら、

編集したいファイルをvimで開く
vim sample2.txt
vim sample3.txt
vim sample5.txt
vim sample7.txt
vim sample11.txt
vim sample13.txt
...
vim sample89.txt
vim sample97.txt

といちいち打ちこんでいってエディタを起動し

  • /rsaで検索し、
  • 修正加えて
  • n, Nで次の単語に移動する

grep結果をvimにぶち込む

しかしスマートではないので、いちいちvimを起動しなくてもいいように

ファイル名だけを一度にvimにぶち込む
vim `grep -li RSA *`

-lはマッチしたファイル名のみ表示するオプションです。

こうすると

{n} 個のファイルが編集を控えています

みたいな標準出力が返されて、vimでn個のファイルを同時に開きます。
ファイルの移動は:nで次のファイル、:Nで前のファイル

書いた理由

別の人の作業を後ろから覗いているとき、「愚直な方法」で示したやり方をやっていました。
当初grepでファイル名のみを出力オプションがあることだけは頭にあったのですが、具体的に-lオプションだということがわからなかったので特に教えたりせず、黙って作業を見守っていました。

また、自分自身最初はパイプを使えばいいものと思っていて、帰ってから自分の環境で

grep -li RSA * | vim

としたところ

Vim: 警告: 端末からの入力ではありません
Vim: 入力を読込み中のエラーにより終了します...
Vim: preserving files...
Vim: Finished.

というエラーが返されてしまいました。

しばらくなんやかんやして、先にgrepを評価するバッククォート(`)を使用するのが正しい、と気づき、自戒の念もこめて書きました。

6
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5