正規表現で並べ替え

正規表現で並べ替え

POSIX正規表現セットがあります*

^BEGIN:VCARD\r$
^VERSION[^A-Z]
^FN[^A-Z]
^N[^A-Z]
^NICKNAME[^A-Z]
^EMAIL[^A-Z]
^X-\([A-Z-]*\)
^TEL[^A-Z]
^ADR[^A-Z]
^ORG[^A-Z]
^TITLE[^A-Z]
^BDAY[^A-Z]
^URL[^A-Z]
^ROLE[^A-Z]
^NOTE[^A-Z]
^END:VCARD\r$

そして、各行が正規表現のいずれかに一致するファイルは次のようになります。

BEGIN:VCARD
VERSION:3.0
N:Doe;Jane;;Ms;
URL:http://janedoe.com/
EMAIL:[email protected]
EMAIL:[email protected]
BDAY:1970-01-01
X-JABBER:[email protected]
X-ICQ:1234567890
END:VCARD

この行に基づいてソートしたいと思います。

  1. 正規表現に一致する行番号(FNで始まる行がNで始まる行の前に来るように)、
  2. 一致グループ(X-ABCがX-DEFの前に来るように)

理想的には、行の他の部分は整列してはいけません。したがって、EMAILで始まる行の順序を維持する必要があります。したがって、予想される結果は次のとおりです。

BEGIN:VCARD
VERSION:3.0
N:Doe;Jane;;Ms;
EMAIL:[email protected]
EMAIL:[email protected]
X-ICQ:1234567890
X-JABBER:[email protected]
BDAY:1970-01-01
URL:http://janedoe.com/
END:VCARD

これを行うための既存のツールはありますか?

編集する:実施結果に基づいてLars Rohrbachの回答

* Gmail連絡先エクスポートファイルのvCard属性の順序。

ベストアンサー1

一般的なsortコマンドは、含める特定の「辞書」を指定する方法を提供せず、コマンドを使用すると正規表現ファイルをgrep提供できますが、出力順序は変更されません。しかし、2つを簡単なforeachループに入れることができます。以下はbashシェルで実行される例です。

for i in `cat fileofregexp`; do grep "$i" myinputfile; done

これは、正規表現ファイルの各正規表現行を 1 つずつ取得し、入力ファイルから一致する項目を出力するため、結果の出力は正規表現の順序でソートされます。正確に一致しない入力ファイルの行は出力に表示されません。

付録:要求に応じてループを使用するバージョンは次のとおりですwhile

while IFS= read -r i; do grep "$i" myinputfile; done  < fileofregexp

おすすめ記事