メモ: Vimでインデントなし貼り付け、矩形選択、ソート

規則なく並んだIDの集合(重複なし)同士を比較しようとして手間取ったのでメモ。

次のような2つのテキストがあり、含まれるID (i-xxxxxxxx) が一致しているかを調べたいとします。ID群だけを抜き出してソートし、2つのファイルに保存してdiffをとります。

テキスト1

           'i-abcdef01' # bastion
            , 'i-cdef0123' # web-1
            , 'i-34567890' # web-2
            , 'i-90123456' # app-1
            , 'i-4567890a' # app-2

テキスト2

i-90123456:
i-34567890:
i-abcdef01:
i-4567890a:
i-cdef0123:

テキスト1のほうが複雑なので、こちらを対象に手順をメモします。

インデントなし貼り付け

そもそもテキスト1を単純にVimコピーアンドペーストすると、インデントが入ってしまうので、次のようにします。

  • :i!(もしくは:a!)
  • システムのペースト(Macならcommand+v)
  • return
    • // これを飛ばすと最後の1行が消えてしまう。なぜ?
  • esc

矩形選択

まず、1行目のシングルクォートより左に数個の文字を入力して、ID群を一列に揃えます。

           '   i-abcdef01' # bastion
            , 'i-cdef0123' # web-1
            , 'i-34567890' # web-2
            , 'i-90123456' # app-1
            , 'i-4567890a' # app-2

次に、Ctrl-vでビジュアルモードに入り、ID部分だけをCtrl-iで選択し、dで切り取ります。

            '   ' # bastion
             , '' # web-1
             , '' # web-2
             , '' # app-1
             , '' # app-2

そして、残った部分をブラックホールレジスタに捨てます("_5d)。

最後に、バッファ内のIDをpで貼り付けます。

i-abcdef01
i-cdef0123
i-34567890
i-90123456
i-4567890a

ここまできました。

ソート

まず、全行選択します。ggで先頭へ移動し、Vで行選択に移行し、Gで最終行へ移動します。

次に、::sortでIDを辞書順にソートします。コロンは2回必要です。

i-34567890
i-4567890a
i-90123456
i-abcdef01
i-cdef0123

こうなりました。

さらに?

できれば上記のソート済みID群と、テキスト2を同様の手順で整形(正確には%s/://gしてからソート)したものとをその場で比較したいのですが、やり方がわからないため、一旦ファイルに保存してdiffをとっています。

もっとよい方法があればぜひ教えてください。