1

この質問をする方法すらわからないので、我慢してください。スキーマを微調整している巨大なXMLで数値を描画している(ほとんど)英数字のリストがあります。それらがどのように作成されたかについての標準がないように思われるので、私はそれらが検証するためのXSD正規表現パターンを作成しようとしています。通常、私はそれらをただ挽くだけですが、この場合、それらは何百もあります。私がやりたいのは、それらを各タイプの図面番号の単一のインスタンスに分離することです。それから、XSDで適切なORステートメントを使用して正規表現を作成できます。

私の環境はWin7ですが、Ubuntu VMとCygwin(現在これらすべてを実行しています)があります。これを実行できるLinuxユーティリティがあるのか​​、それともgrep/sed-fuが弱いのかわかりません。総当たり攻撃(これほど大きくないこのパズルの他のピースに対して行った)を除いて、この問題を減らす方法がわかりません。

このコマンドラインステートメントを使用して、図面の「数字」を取得しました。図面番号を探して並べ替え、一意の番号だけを表示してから、囲んでいるタグを取り除きます。

grep "DrawingNumber" uber.xml | sort | uniq | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' 

これが実際の図面の「数字」のサンプルです(数百もあります):

10023C/10024C *<= this is how it's represented in the XML & I can't (easily) change it.
10023C
10043E
10051B
10051D
10058B
10059C
10447B 10447B *<= this is how it's represented in the XML & I can't (easily) change it.
10064A
10079B
10079D
10082B
10095A
10098B
10100B
10102
10109B
10109C
10115
101178
10118F

私が欲しいのは、図面番号のリストを各タイプの単一のインスタンスに減らすリストです。たとえば、このグループの図面「数字」は次のとおりです。

10023C
10043E
10051B
10051D
10058B
10059C

次のようになります:

nnnnnx 

5桁のすべてのインスタンスを表し、その後に次のようなパターンを作成できる1文字が続きます。

[0-9]{5}[a-z A-Z]{1}

同様に、

10102
10115

次のようになります:

nnnnn

これは、5桁のすべてのインスタンスを表し、その後に何も表示されず、次のようにキャプチャされます。

[0-9]{5}

等々。問題を実行可能な形で提示するのに十分な情報であることを願っています。私が言ったように、私は質問を組み立てる方法さえ知りませんでした、そして私が質問を書くところまで行くとき、私は解決策を見つけてそれを提出さえしません、しかしこれは私を困惑させます。

更新: @nullrevolutionの答えを使用して、これが私が思いついたものです(これにより、以下の私のコメントが明確になりますが、ほとんど読めません)。

私が最終的に使用したコマンドラインは次のとおりです。

grep "DrawingNumber" uber.xml | sort -d | uniq | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | sed 's/[A-Za-z]/x/g;s/[0-9]/n/g' | sort -u

次のようなデータについて:

<DrawingNumber>10430A</DrawingNumber>
<DrawingNumber>10431</DrawingNumber>
<DrawingNumber>10433</DrawingNumber>
<DrawingNumber>10434</DrawingNumber>
<DrawingNumber>10443A</DrawingNumber>
<DrawingNumber>10444</DrawingNumber>
<DrawingNumber>10446</DrawingNumber>
<DrawingNumber>10446A</DrawingNumber>
<DrawingNumber>10447</DrawingNumber>
<DrawingNumber>10447B 10447B</DrawingNumber>
<DrawingNumber>10447B</DrawingNumber>
<DrawingNumber>10454A</DrawingNumber>
<DrawingNumber>10454B</DrawingNumber>
<DrawingNumber>10455</DrawingNumber>
<DrawingNumber>10457</DrawingNumber>

これにより、(上記のスニペットではなく、すべてのデータに対して)の一般化された出力が得られました:

nnnnn
nnnnnn
nnnnnx
nnnnnx nnnnnx
nnnnnx/nnnnnx
nnxxx

それはまさに私が必要としていたものです。私が理解する必要がある次の2つの例は、この新しい方法の恩恵を受けることがわかりました。それで、これが私を何時間節約したか誰が知っていますか?

4

1 に答える 1

2

最初に囲んでいるタグを取り除いてから、次のようにします。

sed 's/[A-Za-z]/x/g;s/[0-9]/n/g' file | sort -u

これにより、すべての文字が「n」に、すべての数字が「x」に置き換えられ、すべての重複が削除されます。

サンプル入力ファイルに対して実行すると、出力は次のようになります。

nnnnnx

それが不可能な場合は、入力ファイルの一部を元の形式で共有していただけますか?

于 2012-12-07T20:01:50.943 に答える