0

そのタイトルが適切に聞こえるかどうかはわかりません…</p>

スペースで区切られた 3 つの「フィールド」で構成される均一な構造を持つファイル (> 1000 行) があるとします。

1. an integer (negative or positive)
   <space>
2. another integer (negative or positive)
   <space>
3. some text (description)

整数は >-10000 および < 10000 です

私の問題は:どうすればいいですか

a) 「最初の整数 <= 1000」AND 「第 2 整数 >=250」AND 「テキストに含まれる内容: ボストン OR ニューヨーク」などの基準でこのファイルをフィルタリングします。

b) サブセットを新しいバッファーに入れて、結果とフィルターの結果のみを読み取ることができるようにしますか?

それが実現可能か合理的かどうかはわかりませんが、Vimのみでそれを行いたいです(とにかくそれは私のスキルを超えています)

ありがとう


@FDinoff:申し訳ありませんが、もちろん、あなたが提案することをすべきでした:

これは、 StartDate 、 EndDate 、および Description を含む年表である可能性があります。

1 -200 -50 Period one in Italy
2 -150 250 Period one in Greece
3  -50  40 Period two in Italy 
4   10  10 Some event in Italy
5   20  20 Event two in Greece

フィルターは次のようになります: (SQL を模倣するために) StartDate <=-50 AND EndDate >=0 AND Description にギリシャが含まれるアイテムをフィルター処理し、結果のフィルター => 行 2

4

1 に答える 1

1

次の一般的な形式は、形式の数値部分と一致します。

^\s*-\?\d\+\s\+-\?\d\+

数値に制限を実装するには、それぞれ-\?\d\+をより具体的なパターンに置き換えます。たとえば、次の場合<= -50:

-\([5-9][0-9]\|[1-9][0-9]\{2,}\)

つまり-、最初の桁が >= 5 である 2 桁の数字、または >= 3 桁の数字のいずれかが続きます。

同様に、次の場合>= 250:

\(2[5-9][0-9]\|[3-9][0-9]\{2,}\)

2つを組み合わせる:

^\s*-\([5-9][0-9]\|[1-9][0-9]\{2,}\)\s\+\(2[5-9][0-9]\|[3-9][0-9]\{2,}\)

説明のパターンでフィルタリングする必要がある場合は、次のように追加します。

^\s*-\([5-9][0-9]\|[1-9][0-9]\{2,}\)\s\+\(2[5-9][0-9]\|[3-9][0-9]\{2,}\)\s\+.\{-}Greece

.\{-}の遅延バージョンです.*

このパターンでフィルタリングし、出力をファイルに書き込むには、次を使用します。

:g/pattern/.w filename

したがって、「最初の番号 <= -50 AND 2 番目の番号 >= 250 AND 'Greece' in description」でフィルタリングし、出力を に書き込みますgreece.out

:g/^\s*-\([5-9][0-9]\|[1-9][0-9]\{2,}\)\s\+\(2[5-9][0-9]\|[3-9][0-9]\{2,}\)\s\+.\{-}Greece/.w greece.out

より複雑な範囲はすぐにこれをさらにばかげたものにします。おそらく、ファイルを解析し、正規表現以外でフィルタリングする方がよいでしょう。

于 2013-08-12T20:29:03.767 に答える