こういう状況のこういう作業
- 一つのディレクトリ上にいくつかのファイルがある
- とある文字列が入っているファイルがそのうちのいくつかある
- (その文字列自体ではなく)その文字列付近を変更したい
具体的にこういう状況のこういう作業
例えば・・・
- 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
を評価するバッククォート(`)を使用するのが正しい、と気づき、自戒の念もこめて書きました。