2017-05-02 13 views
0

私はこのようなファイルを持っています。複数のXML要素を1つのファイルから複数のファイルに分割する

a 
B abc 
c abc 
d abc 
e abc 
<stuff></stuff><?xml version="1.0" encoding="UTF-8" standalone="yes"?><element><moreelements>1</moreelements></element> 

a 
B abc 
c abc 
d abc 
e abc 
<stuff></stuff><?xml version="1.0" encoding="UTF-8" standalone="yes"?><element><moreelements>1234</moreelements></element> 

a 
B abc 
c abc 
d abc 
e abc 
<stuff></stuff><?xml version="1.0" encoding="UTF-8" standalone="yes"?><element><moreelements>12354</moreelements></element> 

a 
B abc 
c abc 
d abc 
e abc 
<stuff></stuff><?xml version="1.0" encoding="UTF-8" standalone="yes"?><element><moreelements>12534</moreelements></element> 

a 
B abc 
c abc 
d abc 
e abc 
<stuff></stuff><?xml version="1.0" encoding="UTF-8" standalone="yes"?><element><moreelements>12634</moreelements></element> 

多くの場合、1000以上の類似アイテムが繰り返されます。

私はファイルを読んで、<element>をすべて自分のファイルに展開します。

だから私のようなテキストが含まれている複数のファイルを作成したい1つのファイルで:

<element><moreelements>1</moreelements></element> 

を私はXML宣言<?xml version="1.0" encoding="UTF-8" standalone="yes"?>を維持することを好むだろうが、それは必要条件ではありません。

したがって、<element>....</element>を1つのファイルで1000回繰り返した場合、1000個のファイルに変換します。

私はawkやsedのようなUNIXユーティリティを使用する方法があると確信していますが、それを達成する方法がわかりません。

おかげ

答えて

2

gawkハック...

$ tag="element>"; awk -v RS="</?$tag" -v t="$tag" ' 
     !(NR%2){print "<"t $0 "</"t > "element_"++c".xml"}' file 

$ head element_* 

==> element_1.xml <== 
<element><moreelements>1</moreelements></element> 

==> element_2.xml <== 
<element><moreelements>1234</moreelements></element> 

==> element_3.xml <== 
<element><moreelements>12354</moreelements></element> 

==> element_4.xml <== 
<element><moreelements>12534</moreelements></element> 

==> element_5.xml <== 
<element><moreelements>12634</moreelements></element> 
1

代替のgawkアプローチ:

awk '$0~/<element>/{match($0, /<element>.+<\/element>/); 
    print substr($0,RSTART,RLENGTH) > "el_"++c".xml"}' file 

head el_* 
==> el_1.xml <== 
<element><moreelements>1</moreelements></element> 

==> el_2.xml <== 
<element><moreelements>1234</moreelements></element> 

==> el_3.xml <== 
<element><moreelements>12354</moreelements></element> 

==> el_4.xml <== 
<element><moreelements>12534</moreelements></element> 

==> el_5.xml <== 
<element><moreelements>12634</moreelements></element> 

$0~/<element>/ - あなたが同じライン上で開始/終了タグを想定して全体<element>タグ

+0

のマッチング - <element>タグ

match($0, /<element>.+<\/element>/)と行だけを検討します。おそらく、 '-v RS ='を追加してレコードの境界を広げてください。 – karakfa

関連する問題