2013-07-02 6 views
8

を使用して:Vimの:ソート私はvimの中で、私は私が使用して並べ替えながら検討して使用したい各行の部分を示すために、正規表現を使用してファイルを並べ替えることができることを知っている複数のパターン

:sort 'regex' r 

です複数の式を組み合わせることは可能ですか?

ここでは、例を持っている:

INPUT:

bar a 2 
foo b 1 
bar b 1 
foo a 2 

:ソート '[AZ]' R

foo b 1 
bar b 1 
bar a 2 
foo a 2 

ソート '[0-9]' R

bar a 2 
bar b 1 
foo b 1 
foo a 2 

(多分何か「好き」:sort '[AZ] | [0-9]」R):

bar b 1 
bar a 2 
foo b 1 
foo a 2 

による

bar a 2 
bar b 1 
foo a 2 
foo b 1 
桁の順序を壊すものを "A" と "B" に、裸の "並べ替え" は動作しませんのでご注意ください!

代替VIM外にも好奇心のために、私はそれはVIMの中にそれを行うには実際に可能かどう知っていただきたいと思います(とafermative場合、どのように;-)

多くのおかげで、 よろしく、受け入れられているが、

+0

'sort '[0-9]' r'の結果は正しく貼り付けられません。結果は異なるはずです。 – Birei

+0

@Birei:そうです。ちょうどそれを修正した。ありがとう! –

答えて

6

あなたが利用可能な外部の並べ替えを持っていると仮定すると、次のように動作するはずです:

:%!sort -k1,1 -k3,3n 

EDIT:説明:

-k

は、ソートキーを指定するために使用されます。 -k1,1は、 key1で開始ソートを意味し、それは key1で終了します。 -k3,3nは、 key3で開始並べ替えを意味し、それを終了します key3; nは数値ソートを表します。つまり、文字列の数値に応じて比較します。

デフォルトでは、ソートはフィールドセパレータとしてブランクから非ブランダへの移行を想定しています。したがって、それは、行bar b 1が3つのフィールドで構成されていると考えます。値がスペース以外の特定の文字(例えば、:)で区切られている場合は、フィールド区切り文字に-t:を追加して指定します。

+0

そうです!しかし、あなたはparamsの意味を説明してもらえますか?それで、私は簡単にそれを別のものに拡張することができます(これは簡単な例です)。 –

+0

@CarlesSala上記の説明を参照してください。 – devnull

+0

完璧な、そのトリックをした!ありがとう! –

2

あなたが求めているものに欠陥があります...最初の単語と番号でソートする場合は、何らかの方法で優先順位を指定する必要があります。

bar b 1 
foo b 1 
bar a 2 
foo a 2 

もちろん、答えは最初のものである:これは、

bar b 1 
bar a 2 
foo b 1 
foo a 2 

のか:他の言葉では、あなたがソートされたリストは、次のようになりたいです。しかし、あなたはそれをvimに伝える必要があります!したがって、私は、あるコマンドでそれを行う(賢明な)方法を考えることはできません... しかし、私は2つでそれを行うことができます。

:sort /\d/ r 
:sort /[a-z]/ r 

この順でコマンドを行うことで、あなたは最初の単語は数よりも優先されますように指定されています。

+0

私はこの欠陥を見ません...そのような要求のための注文の必要性は明らかです。私は明示的に注文を指定しませんでしたが、私はそれを暗にしました(私は2つのルール] | [0-9] '、結果を貼り付け...)。 とにかく、あなたの提案がうまくいく理由を説明してもらえますか?/d /と/ [a-z] /実際に何をしているのですか? –

+0

\ dは[0-9]と等価です。 /.../は、このコンテキストで '...'と入力するのと同じです。 私の構文はおそらくこれを行う「標準化された」方法ですが、あなたの問題は何も問題ありません。それは同じことを意味します。もしあなたがその余分なキーストロークを保存したいならば:sortの代わりに:sorをタイプすることもできますが、私はそれをあなたに混乱させませんでした! この問題は、:sortコマンドが各行で** a **パターンを探し、そのパターンに基づいて行を並べ替えるという欠点があります。 –

+0

しかし、ポイントは、どのようにvimに列1を列3に並べ替えるように指示しているのでしょうか?(つまり、私が言うことができる限り、コマンドの範囲外にある2つの異なるパターンを探しています。 、列2を無視しますか?私はそれも可能ではないと確信しています...そして、どうしてあなたは2つの簡単なコマンドでそれをやってもいいのですか? –

関連する問題