2016-04-06 10 views
0

から複数行文字列のすべてのインスタンスを削除しますInformaticaから生成された大規模なXMLファイルがあります。このファイルには、以下に示す空のXMLタグが複数存在するため、ファイルから削除する必要があります。UNIXファイル

<Person> 
    <Address> 
    </Address> 


</Person> 

ファイルを削除する必要があるすべては上記の6行のテキストの周りに600〜800の出現を、含まれています。

これらのタグの間にデータが存在する可能性があります。その場合は削除しないでください。テキストは上の図とまったく同じ方法で表示された場合にのみ削除する必要があります。 UNIXボックスでPS-perlコマンドが機能しない

+0

あなたはどの言語/ツールあなた」を指定しないでください:

次は、この(あなたがあなたのデータに合わせて調整することができるはず出発点)を解くことについては行くかもしれない方法の簡単な例であります私はシェルや組み込みのツールを想定しています。 awkスクリプトを使用して、シンプルなライン指向のソリューションを作成できます。開始タグを検索し、フラグを設定し、終了タグが表示されるまで出力をスキップします。しかし、これを実際のXMLパーサで行う方がより堅牢です。 Pythonを見てください。基本的なXMLパーサーを簡単に作成できます。 – gavinb

+0

ファイルは、InformaticaによってUNIXサーバーに生成されます。ファイルをクリーンアップしてレポートサーバーにFTPする前に、UNIXシェルコマンドを待つこと。そうではない – sandy111

+0

ファイルは、InformaticaによってUNIXサーバーに生成されます。ファイルをクリーンアップしてレポートサーバーにFTPする前に、UNIXシェルコマンドを待つこと。 Pythonのようなツールを使うのは実現不可能だろう。また、これらのタグの間にデータがない場合にのみ、ラインを取り除く必要があります。つまり、そのまま表示されます。したがって、開始文字列と終了文字列だけを照合しても目的は解決されません。 – sandy111

答えて

0

Awkは行指向ですが、ステートマシンを使用して複数行の処理を行うことができます。スキーマの詳細やサンプルデータがなくても、その動作方法を正確に知ることは難しいです。しかし、各タグがそれ自身の行にあると仮定すると、可能でなければなりません。

#!/usr/bin/env awk 

BEGIN   { state = 0; } 

/<Person>/  { if (state == 0) { print "#Person"; state = 1 } else { state = 0; print } next } 

/<Address>/  { if (state == 1) { print "#Addr"; state = 2 } else { state = 0; print } next } 

/<\/Address>/ { if (state == 2) { print "#CloseAddr"; state = 3 } else { state = 0; print } next } 

/^\s*$/   { if (state == 3) { print "#Blank"; state = 3 } else { state = 0; print } next } 

/<\/Person>/ { if (state == 3 || state == 4) { print "#ClosePerson"; state = 0 } else { state = 0; print } next } 

{ print } # Default action 
関連する問題