web-dev-qa-db-ja.com

タブを使用してテキストを列化する方法(vimまたはシェル上)

データ入力やその他の目的で、タブ区切りのテキストを手動で操作する必要が頻繁にあります。これを行うと、テキストが列に適切に配置されていると役立ちます。例(4スペースタブを想定):

# original format
abcdefghijklmnop    field2
abcdefgh    field2
abcdefghijkl    field2

# ideal format
abcdefghijklmnop    field2
abcdefgh            field2
abcdefghijkl        field2

columnユーティリティを使用してテキストをこのように列化することはよく知っていますが、問題は、スペースを使用して列を整列することであり、特にタブが必要です。この要件は、Tabularizeプラグインを除外しているようにも見えます。

vim内またはシェルで、具体的にタブを使用してテキストを列化する方法はありますか? groff/tblでできるように見えますが、正直言って、それを台無しにするよりも手作業で列に並べたいと思います。

7
kine

csv.vim-csvファイル用のFiletypeプラグイン はタブ区切りファイルもサポートし、:ArrangeColumnおよび:UnArrangeColumnそのためのコマンド。

6
Ingo Karkat

タブの表示サイズを最長のフィールドより少し大きく設定します。

# original format
abcdefghijklmnop<Tab>field2
abcdefgh<Tab>field2
abcdefghijkl<Tab>field2
I have spaces!<Tab>field2

Vimでは、

:echo len("abcdefghijklmnop") " Reports 16
:set noexpandtab tabstop=17

これを1つのコマンドに要約することはできますが、方法がわかりません。最新のVimを実行している場合、:set listは派手な文字(構成も可能)でハードタブを示します。それ以外の場合は、^I(必要なものではありません)または空白として表示されます。

# displays like this
abcdefghijklmnop>field2
abcdefgh>        field2
abcdefghijkl>    field2
I have spaces!>  field2

編集: 実際に実行されているvimからの例!

6
Cheezmeister

テーブルを適切にスペースアラインメントした場合(前述のTabularizeまたは代替のAlignプラグインを使用)、次のコマンドを使用してスペースをタブに変換できます。

:%retab!
:%substitute/ \+/\t/g

最初のコマンドは、幅を変更せずに、可能な場合はインデントをタブに置き換えます(これは、:set noexpandtab)、2番目は残りのスペースを(より大きな)タブストップに変換します。

1
Ingo Karkat

godlygeek/tabular プラグインを使用して選択できます

:%Tabularize /\t.*/
0
SergioAraujo