[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Suchen und Ersetzen in großer XML-Datei mit kruden Zeichen - wie gehts am besten?



Hi,

ich möchte in einer relativ großen XML-Datei (>1,5 GB) einige Tags, Kommentare und CDATA-Abschnitte global ersetzen. Als GUI-verwöhnter Bequemling dachte ich erst, dass das ziemlich trivial sein müsste, bin dann aber ein paarmal gegen die Wand gerannt. Bestimmt hat hier jemand mehr Erfahrung und kann mir ein wenig auf die Sprünge helfen.

Zum einen handelt es sich wohl um eine Datei in UTF-8, die auch Unicode bleiben muß (welche Tools sind wirklich Unicode-clean?), zum anderen steht mir auf dem betreffenden Rechner nur 512 MB RAM zur Verfügung (ein beliebiger Editor scheidet wohl aus, weil sich bspw. nano oder vi an der Datei totladen).

Ich dachte dann, dass ich mir die Datei einfach auf meinen lokalen Rechner herunterladen und hier verarbeiten könnte, so richtig gut lässt sich das XML aber nicht komprimieren (Upload der editierten Datei dauert mit ADSL-Upstream ewig). Last but not least habe ich beim Googeln ob der Fülle möglicher Tools dann ein wenig den Überblick verloren, was wirklich geeignet wäre und womit ich mir womöglich eher zusätzliche Probleme einhandele, zumal die zu ersetzenden Strings nicht nur einfachen Text, sondern auch "krude" Zeichen wie <, /, | und [ enthalten; ein einfaches sed 's/string1/string2/g' FILE funktionert also nicht ohne weiteres [4]; ähnliches gilt wohl für xargs, perl -ipe und replace.

Verkürzt gesagt sieht der S&R-Ausdruck in etwa so aus: Aus

   "</string1>"

soll werden

   "<NEWLINE>[[{{string2|{{value}}}}]]<NEWLINE></string1>",

wobei <NEWLINE> möglichst ein Zeilenumbruch bzw. eine neue Zeile werden soll (wie "\n" bzw. "\r" in Perl); letzteres dient aber, wenn ich die XML-Datei richtig lese, nur der Formatierung eines CDATA-Abschnitts.

Würde etwa folgendes funktionieren [2] [3], oder geht es unter Debian auch irgendwie einfacher (sprich: übersichtlicher)? Irgendwie macht mich diese Maskierung völlig wuschig ;-/

perl -i.bak -p -e 's/\<\/string1\>/\n\[\[\{\{string2\|\{\{value\}\}\}\}\]\]\n\<\/string1\>/ig' FILE.xml

Beim weiteren Googeln stieß ich auf [5], der die zu ersetzenden Strings nicht mit "\", sondern mit "|" trennt ("perl -p -i[.ext] -e 's|x|y|[ig]' filename") - was ist denn nun eigentlich richtig?

Vor längerer Zeit wurde hier mal ein nettes Skript gepostet [1]; so etwas ähnliches bräuchte ich, nur ohne die dortige Einschränkung: "Bei Sonderzeichen wie !"'`´§$ usw. kann es zu Fehlern führen, dieses Programm ist zum suchen und ersetzen normaler Texte gedacht [...]"...

Danke & mfG -asb


[1] http://www.pa-s.de/php/script-P91SE-V.0.9.1---suchen-und-ersetzen-f%FCr-Linux-54.php

[2] Nach Lektüre von http://www.perl.com/pub/a/2004/10/14/file_editing.html
[3] Zusammengebaut nach "Maskierung von Zeichen in regulären Ausdrücken" in http://de.selfhtml.org/perl/sprache/regexpr.htm [4] Mittlere Ratlosigkeit nach Lesen von http://www.faqs.org/faqs/editor-faq/sed/ [5] http://www.sns.ias.edu/~jns/wp/2006/02/15/how-to-perform-in-place-editing-of-a-file-using-perl/



Reply to: