2016-04-06 5 views
0

Ich habe eine große XML-Datei generiert von Informatica, die mehrere Vorkommen von leeren XML-Tags wie unten angegeben hat, die aus der Datei entfernt werden müssen.Entfernen Sie alle Instanzen von mehrzeiligen Zeichenfolge aus UNIX-Datei

<Person> 
    <Address> 
    </Address> 


</Person> 

Die Datei enthält etwa 600-800 Vorkommen der über 6-Zeilen Text, von denen alle entfernt werden muss.

Zwischen diesen Tags können sich Daten befinden. In diesem Fall sollten sie nicht entfernt werden. Die Entfernung sollte nur dann erfolgen, wenn der Text genau wie oben angezeigt wird. PS-Perl-Befehl funktioniert nicht in meiner UNIX-Box

+0

Sie nicht angeben, welche Sprache/Werkzeug, das Sie‘ Ich schaue mir das an, also nehme ich Shell oder eingebaute Tools an. Sie könnten eine einfache linienorientierte Lösung mit einem awk-Skript erstellen. Suchen Sie nach dem Start-Tag, setzen Sie ein Flag und überspringen Sie die Ausgabe, bis Sie das End-Tag sehen. Aber es wäre robuster, dies mit einem tatsächlichen XML-Parser zu tun. Sehen Sie sich Python an - Sie können einen einfachen XML-Parser ganz einfach erhalten. – gavinb

+0

Die Dateien werden von Informatica auf einem UNIX-Server generiert. Ich freue mich auf einen UNIX-Shell-Befehl, um die Datei zu bereinigen, bevor Sie sie an Berichtsserver weiterleiten. Wäre nicht – sandy111

+0

Die Dateien werden von Informatica auf einem UNIX-Server generiert. Ich freue mich auf einen UNIX-Shell-Befehl, um die Datei zu bereinigen, bevor Sie sie an Berichtsserver weiterleiten. Wäre es nicht möglich, ein Tool wie Python zu verwenden? Außerdem müssen die Zeilen nur entfernt werden, wenn zwischen diesen Tags keine Daten vorhanden sind, d.h. sie erscheinen wie sie sind. Eine Übereinstimmung nur der Anfangs- und Endzeichenfolge würde den Zweck nicht lösen. – sandy111

Antwort

0

Awk ist zeilenorientiert, aber Sie können eine Zustandsmaschine verwenden, um Multi-Line-Verarbeitung durchzuführen. Es ist schwierig, genau zu wissen, wie es sich verhalten sollte, ohne weitere Schemadetails und Beispieldaten. Aber vorausgesetzt, jedes Tag ist in einer eigenen Zeile, sollte es möglich sein.

Es folgt ein einfaches Beispiel, wie man über die Lösung dieses (ein Ausgangspunkt, die Sie sollten auf Ihre Daten anpassen können) gehen könnte:

#!/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