Zeilenersatz in xml Datei mit vielen Sonderzeichen
Hallo zusammen
ich hänge gerade an einer Vereinfachung xml Dateien automatisch anzupassen.
Bisher wurden xml Template Dateien manuell editiert um eine Zeile anzupassen und deren eigenen Namen einzufügen.
Aufbau ist:
cat "Franz Haidar-.xml"
Beispiel "1"
Beispiel "2 1 Sonderzeichen"
FILE "FILENAMEN HIER EINTRAGEN.xml" UTF16
Beispiel "3 9 Sonderzeichen"
...
Oft wird dies vergessen und einige unserer Parser/Interpreter streiken dann weil sie den Namen nicht finden.
Ich will nun die Zeile
FILE "FILENAMEN HIER EINTRAGEN.xml" UTF16
vereinfachen indem ich mit einer FOR Schleife alle xml abfange und deren Name eintrage oder zumindest finde. Damit liegt der FILENAME als Variable vor und soll damit
FILE "FILENAMEN HIER EINTRAGEN.xml" UTF16
mit einem
"
sed -i "s/^FILE.*/FILE $SAMZ/" "$SAMZ"
"
wobei
SAMZ="Franz Haidar-.xml"
geht das schon Ansatzweise, aber leider gibt es Milliarden Sonderzeichen wie " oder ' oder : oder White spaces oder Klammern oder oder oder. Auch der Characterset ist von CP1252 über 1250 zu UTF8 bis 32 erlaubt (also auch Laute wie ř)
Ab da ist mein sed/awk Wissen komplett am Ende.
Ich habe bisher 500 solcher Dateien gefunden welche falscch formatiert sind. Per Hand bin ich da in 4h durch, aber das Problem kommt ja immer wieder.
Hat da jemand einen Lösungsvorschlag? Ein GNU awk, sed, grep und co stehen zur Auswahl; kein perl und Co. OS darunter ist ein Win2019 mit GNU Toolset.
Gruß
Sam
ich hänge gerade an einer Vereinfachung xml Dateien automatisch anzupassen.
Bisher wurden xml Template Dateien manuell editiert um eine Zeile anzupassen und deren eigenen Namen einzufügen.
Aufbau ist:
cat "Franz Haidar-.xml"
Beispiel "1"
Beispiel "2 1 Sonderzeichen"
FILE "FILENAMEN HIER EINTRAGEN.xml" UTF16
Beispiel "3 9 Sonderzeichen"
...
Oft wird dies vergessen und einige unserer Parser/Interpreter streiken dann weil sie den Namen nicht finden.
Ich will nun die Zeile
FILE "FILENAMEN HIER EINTRAGEN.xml" UTF16
vereinfachen indem ich mit einer FOR Schleife alle xml abfange und deren Name eintrage oder zumindest finde. Damit liegt der FILENAME als Variable vor und soll damit
FILE "FILENAMEN HIER EINTRAGEN.xml" UTF16
mit einem
"
sed -i "s/^FILE.*/FILE $SAMZ/" "$SAMZ"
"
wobei
SAMZ="Franz Haidar-.xml"
geht das schon Ansatzweise, aber leider gibt es Milliarden Sonderzeichen wie " oder ' oder : oder White spaces oder Klammern oder oder oder. Auch der Characterset ist von CP1252 über 1250 zu UTF8 bis 32 erlaubt (also auch Laute wie ř)
Ab da ist mein sed/awk Wissen komplett am Ende.
Ich habe bisher 500 solcher Dateien gefunden welche falscch formatiert sind. Per Hand bin ich da in 4h durch, aber das Problem kommt ja immer wieder.
Hat da jemand einen Lösungsvorschlag? Ein GNU awk, sed, grep und co stehen zur Auswahl; kein perl und Co. OS darunter ist ein Win2019 mit GNU Toolset.
Gruß
Sam
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 7090373855
Url: https://administrator.de/contentid/7090373855
Ausgedruckt am: 24.11.2024 um 14:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo,
wo sind wir? sed - also Linux Server?
Ist das ein Dauerzustand oder bleibt es bei 500 und ein paar zerquetschten?
Mirth Connect
Apache Camel
Mit Mirthconnect lassen sich über die Kanäle auch Ausgaben manipulieren. Gesundheitswesen darf einen nicht schrekcen. Man muss ja nicht h7 nutzen. Apache Camel ist auch ganz Groß.
Man hat Log Dateien. Kann einen Webserice rasch aufbauen oder die Dateien auf File Ebene/ via TCP o.ä. versenden.
Darum erstmal die Frage nach dem Betriebssytem und der Größe. Das Schöne an Mirth Connect u.ä. ist, dass man einfach belegen kann was wohin umgesetzt wurde. Oder eben warum nicht.
Ansonsten hast du hier auch viele PowerShell Beispiele. PS gibt es ja auch für Linux. Ggf. kommst du damit schnell zum Ziel. Bzw. kann man es einfach von Windows auf Linux übertragen. Den Code unter Windows schreiben und später auf Linux ausführen.
mfg Crusher
wo sind wir? sed - also Linux Server?
Ist das ein Dauerzustand oder bleibt es bei 500 und ein paar zerquetschten?
Mirth Connect
Apache Camel
Mit Mirthconnect lassen sich über die Kanäle auch Ausgaben manipulieren. Gesundheitswesen darf einen nicht schrekcen. Man muss ja nicht h7 nutzen. Apache Camel ist auch ganz Groß.
Man hat Log Dateien. Kann einen Webserice rasch aufbauen oder die Dateien auf File Ebene/ via TCP o.ä. versenden.
Darum erstmal die Frage nach dem Betriebssytem und der Größe. Das Schöne an Mirth Connect u.ä. ist, dass man einfach belegen kann was wohin umgesetzt wurde. Oder eben warum nicht.
Ansonsten hast du hier auch viele PowerShell Beispiele. PS gibt es ja auch für Linux. Ggf. kommst du damit schnell zum Ziel. Bzw. kann man es einfach von Windows auf Linux übertragen. Den Code unter Windows schreiben und später auf Linux ausführen.
mfg Crusher
Hi
Der Post ist echt verwirrend geschrieben musste das 10 mal lesen bevor mir einigermaßen klar war was gemeint ist, zumal das keinerlei korrekte XML-Syntax war ...
Wenn man eh auf einem Windows Server arbeitet dann doch gleich Bordmittel z.B. unten stehendes Powershell mit einem vernünftigen Parser einsetzen statt dieses bei XML gefährliche "String-Replace" zu benutzen!
Ein Beispiel für eine XML-Datei mit folgendem Aufbau:
Dann ersetzt das folgende Powershell-Skript den Inhalt jedes XML-Files in einem Ordner bei welcher der Knoten nicht mit dem Dateinamen übereinstimmt, den Inhalt des Knotens durch den aktuellen Dateinamen dieser Datei
So sind auch Sonderzeichen kein Thema mehr.
Hoffe das war jetzt am Ende richtig interpretiert. Würde aber dringend dazu raten den Post dahingehend nochmal zu überarbeiten, würdest du sicher mehr Feedback damit erhalten. Danke!
Gruß
Der Post ist echt verwirrend geschrieben musste das 10 mal lesen bevor mir einigermaßen klar war was gemeint ist, zumal das keinerlei korrekte XML-Syntax war ...
Wenn man eh auf einem Windows Server arbeitet dann doch gleich Bordmittel z.B. unten stehendes Powershell mit einem vernünftigen Parser einsetzen statt dieses bei XML gefährliche "String-Replace" zu benutzen!
Ein Beispiel für eine XML-Datei mit folgendem Aufbau:
<?xml version="1.0" encoding="utf-8"?>
<root>
<FILE>Dateiname_2342j34ljl2jk43.xml</FILE>
</root>
# Jede Datei bei dem der Knoten "/root/FILE" nicht mit dem Dateinamen übereinstimmt verarbeiten
foreach($file in Get-ChildItem 'D:\Ordner' -File -Filter *.xml | ?{(Select-XML $_.Fullname -XPath '/root/FILE').Node.innerText -ne $_.Name}){
# XML Datei in XML-Document-Object laden
# (Die Load-Methode erkennt im Gegensatz zur Verwendung von Get-Content das korrekte Encoding der XML-Datei!)
$xml = New-Object XML
$xml.Load($file.Fullname)
# Inhalt des Knotens durch Dateinamen ersetzen
$xml.root.FILE = $file.Name
# XML Datei wieder speichen
$xml.Save($file.Fullname)
}
Hoffe das war jetzt am Ende richtig interpretiert. Würde aber dringend dazu raten den Post dahingehend nochmal zu überarbeiten, würdest du sicher mehr Feedback damit erhalten. Danke!
Gruß
Bin gespannt wie das mit den Steuerzeichen aussieht, denn im Filenamen darf sich alles tummeln was NTFS/ZFS/ext4/UFS erlaubt.
Die sind wie gesagt kein Problem da das XMLDocument-Object das korrekt handelt und bei Bedarf das schon von selbst XML gerecht escaped.Und btw. läuft die PS natürlich auch unter Linux.
XML Dateien sollte man aus diesen und anderen Gründen automatisiert immer mit einem vernünftigen Parser bearbeiten, denn sonst besteht die Gefahr eine invalide XML zu erzeugen.