Vimでテキストファイルを一括編集 実習編 −1

複数のファイルに対して一括編集 実習編−1

前回は導入編ということで予備知識というかそういった説明をしました。今回は実践編です。

前回も書いたとおり、いきなりでは難しいので3つのステップを踏みます。
1.一行に対して処理をするマクロをつくる
2.ファイル内の各行に1.の処理を適用するマクロをつくる。
3.複数のファイルに対して2.の処理を連続して実行する。

今回やるのは2.までです

実際に使うのは次のようなテキストです。

再生: 君の知らない物語 (テレビアニメ『化物語』エンディングテーマ) 1. 君の知らない物語 (テレビアニメ『化物語』エンディングテーマ)
再生: カサブタ (テレビアニメ『金色のガッシュベル!!』オープニングテーマ) 2. カサブタ (テレビアニメ『金色のガッシュベル!!』オープニングテーマ)
再生: おジャ魔女カーニバル!! (テレビアニメ『おジャ魔女どれみ』オープニングテーマ) 3. おジャ魔女カーニバル!! (テレビアニメ『おジャ魔女どれみ』オープニングテーマ)
再生: 英雄 (特撮テレビドラマ『ウルトラマンネクサス』第1期オープニングテーマ) 4. 英雄 (特撮テレビドラマ『ウルトラマンネクサス』第1期オープニングテーマ)
再生: Snow halation (テレビアニメ『ラブライブ!』第2期挿入歌) 5. Snow halation (テレビアニメ『ラブライブ!』第2期挿入歌)
再生: DREAM SOLISTER (テレビアニメ『響け!ユーフォニアム』オープニングテーマ) 6. DREAM SOLISTER (テレビアニメ『響け!ユーフォニアム』オープニングテーマ)
再生: ペガサス幻想 (テレビアニメ『聖闘士星矢』オープニングテーマ) 7. ペガサス幻想 (テレビアニメ『聖闘士星矢』オープニングテーマ)
再生: 僕たちの行方 (テレビアニメ『機動戦士ガンダムSEED DESTINY』第3期オープニングテーマ) 8. 僕たちの行方 (テレビアニメ『機動戦士ガンダムSEED DESTINY』第3期オープニングテーマ)
再生: My Soul,Your Beats! (テレビアニメ『Angel Beats!』オープニングテーマ) 9. My Soul,Your Beats! (テレビアニメ『Angel Beats!』オープニングテーマ)
再生: 君が好きだと叫びたい (テレビアニメ『SLAM DUNK』オープニングテーマ) 10. 君が好きだと叫びたい (テレビアニメ『SLAM DUNK』オープニングテーマ)
再生: Good Bye,Good Luck (テレビアニメ『NARUTO -ナルト- 少年篇』オープニングテーマ) 11. Good Bye,Good Luck (テレビアニメ『NARUTO -ナルト- 少年篇』オープニングテーマ)
再生: オリオンをなぞる (テレビアニメ『TIGER & BUNNY』オープニングテーマ) 12. オリオンをなぞる (テレビアニメ『TIGER & BUNNY』オープニングテーマ)
再生: またあした (テレビアニメ『みつどもえ』『本気戦隊ガチレンジャー』主題歌) 13. またあした (テレビアニメ『みつどもえ』『本気戦隊ガチレンジャー』主題歌)

これはEnson3というアルバムの商品説明部分(amazonによる)からその曲名リストだけをコピペしたものです。
元はこんな感じでした。
enson6.png
1行毎に曲名が並んでいますがテキストとしてコピーしたものはトラック番号を挟んでタイトルと番組名が2回出てきます。これをトラック番号以下だけを残したいと思います。

通常のVimの操作はこんな感じです。

d/[0-9]\+\.

 
dは切り取りオペレータ
/は検索で
正規表現を使ってトラック番号にマッチするようにします。
[0-9]は0〜9の数字にマッチし、\+は直前の文字の1回以上の繰り返し([0-9]*[0-9]とおなじ)
\.で次に.ドットが来るパターンにマッチするようにしました。

これでトラック番号以下が残りました。
これで良さそうなので(uや:edit!で)変更前の状態に戻してから
一連の操作をマクロにします。
マクロは
q[レジスタ][操作]q
で記録し
@[レジスタ]
で実行します。
レジスタとは記憶領域でa-zの好きな1文字を使えばよいです。

ではxレジスタに操作を記録しましょう。
qxd/[0-9]\+\.[Enter]q
jで次の行に移って@xをするとうまいことできています。
10@xと打てば操作を10回繰り返すことができるのですが
それだと次の行に移るコマンドがないので失敗します。
これを避けるためにはマクロの最後にjを加えます。
qy@xjq
と打てばyレジスタにxの内容とjがつながって入ります。
(qXjqとすればxに上書きすることも可能です。が、今回はxを別の使い方をしますので上書きしません。)

10@yとすれば10行分処理できています。
+g(コントロールキーを押しながらgを打つ)でファイルの行数がわかりますので
14@yを打つとファイル末尾までうまくいきそうです。
が、内容が消えてしまいました。
これはファイル末尾まで行って先頭からもう一度検索してしまったためです。
勝手に先頭に戻らないようにするには
:set nowrapscan
というコマンドを実行しておきましょう。
これなら100@yと打っても末尾まで行ったら検索が終わりますので思っていた通りの動作をします。

ここまでできれば
ファイルの先頭から処理することはできます。
ですが不便なのは繰り返す回数を指定すること。
今回は多めに指定すればいいので難しくないのですが違うケースでは厄介になるかもしれません。

1行向けに書いたマクロをファイルの各行に適用することができるコマンドがあります。
:%normal @[レジスタ]
このコマンドを使えば柔軟な繰り返しが可能になります。(興味がある方は実践VimやほかのHPをご覧ください)

1行向けのマクロ(次の行に移動しないバージョン)はxレジスタに保存してあるので
:%normal @x
これでスマートに繰り返しを行うことが出来ました。
次の処理のためにこれもマクロにしましょう。
qz:%normal @xq
でzレジスタに保存します。