メモ: 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をとっています。
もっとよい方法があればぜひ教えてください。