BxB
Lieutenant
- Registriert
- Apr. 2005
- Beiträge
- 818
Hey Leute, meine Unix/Linux-Kenntnisse sind auf die Basics beschränkt, daher waren die ersten Versuche mit SED ohne Erfolg gewesen.
Das Szenario: Ich habe eine Eingabe-Datei mit XML-Inhalt, welches alles auf einer einzigen Zeile steht. Diesen Inhalt will ich auf mehrere Datei (z.B. feste 4 Dateien) gleichmäßig mit Zeilenformatierung aufteilen, wobei jede Datei den Header und Footer erhält.
Die Input XML-Datei als Beispiel:
Problem: Da wie bei id=2 auch flexibel weitere xml-Elemente sein können, kann man nicht jedes geschlossene Tag zur neuen Zeile machen und mit fester Zeilenanzahl arbeiten. Es muss etwas flexibles her.
Meine Idee:
---------------- Teil 2 der Fragen -------------
Hey, hab das mit euren Vorschlägen mir angeschaut, leider hatte ich kaum Wahl der Tools für Alternativen. Durch Recherche (angeregt durch die Kommentare) habe ich die bisherigen Anpassungen mit dem geplanten SED hinbekommen. Ich hab noch eine Frage:
Wie kann ich den namespace (Nur Buchstaben und Zahlen) aus einem XML-Element auslesen und in einer Variable speichern?
<?xml><n0:test><n0:testing>1</n0:testing><n0:testing>2</n0:testing></n0:test>
Anmerkung: Ich weiß, dass so etwas eigentlich über XML-Parser geschehen soll für eine saubere Lösung. Da die XML-Struktur bekannt ist, einem festen schema folgt und am Ende immer "</n0:test>" steht, sollte ein grep/sed oder so hoffentlich reichen.
ich probiere grade als Autodidaktischer Unix-Anfänger mit https://www.jdoodle.com/test-bash-shell-script-online etwas zu erstellen, was aber (ohne erfolg bisher) im Ansatz wie ne QuickNDirty Hacklösung aussieht. Dort war mein Ziel sowas zu kriegen:
beim versuch mit SED habe ich gemerkt, dass es GREEDY ist und sowas wie eine Suche nach "></.*:test>" zum größtmöglichen String führt. und das ich mit SED aktuell nur syntax für den austausch kenne, nicht der reinen Extraktion. Ich merke einfach - mir fehlen da iwie noch die Unix-Erfahrung mit String-Manipulation und selektiver Extraktion >_<
Das Szenario: Ich habe eine Eingabe-Datei mit XML-Inhalt, welches alles auf einer einzigen Zeile steht. Diesen Inhalt will ich auf mehrere Datei (z.B. feste 4 Dateien) gleichmäßig mit Zeilenformatierung aufteilen, wobei jede Datei den Header und Footer erhält.
Die Input XML-Datei als Beispiel:
<?xml version="1.0" encoding="UTF-"8" ?><mainpart adds="notplain"><content><id>1</id><one>1</one><two>2</two></content><content><id>2</id><one>1</one><two>2</two><extras><three>3</three></extras></content><content><id>nEntrys</id><one>1</one><two>2</two></content></mainpart> |
Problem: Da wie bei id=2 auch flexibel weitere xml-Elemente sein können, kann man nicht jedes geschlossene Tag zur neuen Zeile machen und mit fester Zeilenanzahl arbeiten. Es muss etwas flexibles her.
Meine Idee:
- Ich splitte das ganze in 3 Teile mit jeweils einer Zeile: HEADER, CONTENT und FOOTER. Header und FOOTER werden gemerkt und aus der Verarbeitungsdatei entfernt (head/tail), um sie später wieder in den aufgeteilten Dateien angefügt werden. Das Arbeiten mit temporären Dateien wäre eine Optionen (xxx > "$filename"_temp.xml oder so?)
HEADER = <?xml version="1.0" encoding="UTF-"8" ?><mainpart adds="notplain">
CONTENT = <content><id>1</id><one>1</one><two>2</two></content><content><id>2</id><one>1</one><two>2</two><extras><three>3</three></extras></content><content><id>nEntrys</id><one>1</one><two>2</two></content>
FOOTER = </mainpart>
Hier fällt mir noch kein SED ein. Ich müsste theoretisch nen filter machen, der die eine zeile beendet, wenn das mainpart endet. und das schließende </mainpart> als FOOTER auch noch mal abtrennt.
- Die Verarbeitungsdatei, die aus dem reinen CONENT besteht wird nun weiter verarbeitet und jedes schließende </content> soll zur neuen Zeile führen. Dies soll über ein eigenes SED geschehen. Wenn ich es aktuell korrekt gelesen habe, würde ein "s" anfangs für Substitution - also Austausch - stehen, dann der filter für das </content>, danach wodurch das ersetzt wird und am ende ein "g" für beendigung der substitution?
sed 's/>/>\n/g' data.xml > data_with_newlines.xml ==> Beispiel, was nach jedem Greater-Operator ">" eine neue Zeile generiert.
Jetzt soll aber </content> als Suchkriterium genutzt werden (wie escape ich das? mit \ vor dem / ?) ... mein Versuch ginge so:
sed 's/<\ /content>/<\ /content>\ng' data.xml > content_each_on_a_newline.xml
- Wenn ich das geschafft habe, könnte ich die Anzahl der Zeichen zählen (wc -l $FILENAME), einen DIVISOR berechne auf die anzahl der verschiedenen Dateien und dann per SPLIT versuche gleichmäßig die aufzuteilen.
Beim Aufteilen wären HEADER und FOOTER jeweils anzufügen und die liste des content soll nach jedem Ende Tag eine neue Zeile erhalten (keine Doppelzeilen).
- Was haltet ihr von dem Vorgehen? Gibt es eine bessere Lösung als Herangehen?
- Wie müssten die SED-Befehle dafür aussehen?
---------------- Teil 2 der Fragen -------------
Hey, hab das mit euren Vorschlägen mir angeschaut, leider hatte ich kaum Wahl der Tools für Alternativen. Durch Recherche (angeregt durch die Kommentare) habe ich die bisherigen Anpassungen mit dem geplanten SED hinbekommen. Ich hab noch eine Frage:
Wie kann ich den namespace (Nur Buchstaben und Zahlen) aus einem XML-Element auslesen und in einer Variable speichern?
<?xml><n0:test><n0:testing>1</n0:testing><n0:testing>2</n0:testing></n0:test>
Anmerkung: Ich weiß, dass so etwas eigentlich über XML-Parser geschehen soll für eine saubere Lösung. Da die XML-Struktur bekannt ist, einem festen schema folgt und am Ende immer "</n0:test>" steht, sollte ein grep/sed oder so hoffentlich reichen.
ich probiere grade als Autodidaktischer Unix-Anfänger mit https://www.jdoodle.com/test-bash-shell-script-online etwas zu erstellen, was aber (ohne erfolg bisher) im Ansatz wie ne QuickNDirty Hacklösung aussieht. Dort war mein Ziel sowas zu kriegen:
echo "<?xml><n0:test><n0:testing>1</n0:testing><n0:testing>2</n0:testing></n0:test>" > file ns=$('werte_folgenden_teil_aus_</.*:test>_und_merke_das_.*_in_ns') echo 'ns:['$ns']' |
Zuletzt bearbeitet: