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: