Zeichen in einer Datei ersetzen
Hallo, ich muss häufig fehlerhafte Epub-Dateien korrigieren, was meistens eine elende Tipparbeit bedeutet. In der Datei befinden sich Einträge wie: ---------------------------8<--------------------------- <navPoint id="navPoint-38" playOrder="38"> <navLabel> <text>ABC</text> </navLabel> <content src="Text/section-0039.html" /> </navPoint> <navPoint id="navPoint-38" playOrder="38"> <navLabel> <text>GHIJ</text> </navLabel> <content src="Text/section-0040.html" /> </navPoint> <navPoint id="navPoint-40" playOrder="40"> <navLabel> <text>KLM</text> </navLabel> <content src="Text/section-0041.html" /> </navPoint> <navPoint id="navPoint-43" playOrder="43"> <navLabel> <text>XYZ</text> </navLabel> <content src="Text/section-0042.html" /> </navPoint> --------------------------->8-------------------------- Entscheidend sind navPoint und playOrders, die fortlaufend numeriert sein müssen. Es dürfen also keine Zahlen doppelt vorkommen und keine fehlen, die zusammengehörenden navPoints und playOrders allerdings müssen identisch sein. Bei nur wenigen Einträgen korrigiere ich das einfach von Hand, aber bei 200 und mehr Einträgen macht das einfach keinen Spaß mehr. Am besten wäre eine Lösung im vim, aber sed und Co. wären ebenfalls okay. Alternativ könnte ich mir vorstellen, nur die navPoints oder die playOrders von Hand zu korrigeren, wenn es eine Möglichkeit gäbe, diesen Wert anschließend im vim oder mit sed und Co. entsprechend in die zugehörigen navPoints bzw. playOrders zu übernehmen. Beste Grüße Heinz -- Buchsatz für Autoren. Vom Manuskript zum Buch www.pahlke-online.de Bücher abseits des Mainstreams www.buchentdeckungen.de Barrierefreies Webdesign www.Pahlke-KunstWebDesign.de -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Fri, 08 Nov 2013, Heinz W. Pahlke schrieb:
ich muss häufig fehlerhafte Epub-Dateien korrigieren, was meistens eine elende Tipparbeit bedeutet.
In der Datei befinden sich Einträge wie:
<navPoint id="navPoint-38" playOrder="38"> <navLabel> <text>ABC</text> </navLabel> <content src="Text/section-0039.html" /> </navPoint> <navPoint id="navPoint-38" playOrder="38"> <navLabel> <text>GHIJ</text> </navLabel> <content src="Text/section-0040.html" /> </navPoint> <navPoint id="navPoint-40" playOrder="40"> <navLabel> <text>KLM</text> </navLabel> <content src="Text/section-0041.html" /> </navPoint> <navPoint id="navPoint-43" playOrder="43"> <navLabel> <text>XYZ</text> </navLabel> <content src="Text/section-0042.html" /> </navPoint>
Entscheidend sind navPoint und playOrders, die fortlaufend numeriert sein müssen. Es dürfen also keine Zahlen doppelt vorkommen und keine fehlen, die zusammengehörenden navPoints und playOrders allerdings müssen identisch sein.
Bei nur wenigen Einträgen korrigiere ich das einfach von Hand, aber bei 200 und mehr Einträgen macht das einfach keinen Spaß mehr.
Am besten wäre eine Lösung im vim, aber sed und Co. wären ebenfalls okay.
Quick & dirty:
perl -w -p -i.orig -e '
BEGIN {
our $i=0;
our $fmt = q{<navPoint id="navPoint-%d" playOrder="%d">};
}
if(/
Hallo, Am Fri, 08 Nov 2013, David Haller schrieb
Quick & dirty:
perl -w -p -i.orig -e ' BEGIN { our $i=0; our $fmt = q{<navPoint id="navPoint-%d" playOrder="%d">}; } if(/
Leider setzt das alle navPoint und playOrder auf 0 :-( Beste Grüße Heinz -- Buchsatz für Autoren. Vom Manuskript zum Buch www.pahlke-online.de Bücher abseits des Mainstreams www.buchentdeckungen.de Barrierefreies Webdesign www.Pahlke-KunstWebDesign.de -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Fri, 08 Nov 2013, Heinz W. Pahlke schrieb:
Am Fri, 08 Nov 2013, David Haller schrieb
Quick & dirty:
perl -w -p -i.orig -e ' BEGIN { our $i=0; our $fmt = q{<navPoint id="navPoint-%d" playOrder="%d">}; } if(/
Leider setzt das alle navPoint und playOrder auf 0 :-(
Seltsam. Hier klappt das im Test einwandfrei mit perl 5.14 unter oS 12.1 und 5.16 unter oS 12.3. Hast du sicher du das '$i++;' drin hast? -dnh -- Sigmentation fault. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Fri, 08 Nov 2013, David Haller schrieb
Seltsam. Hier klappt das im Test einwandfrei mit perl 5.14 unter oS 12.1 und 5.16 unter oS 12.3.
Hast du sicher du das '$i++;' drin hast?
Absolut sicher. Zum einen habe ich es per Copy and Paste in der Kommandozeile und zum anderen ebenfalls per Copy and Paste in eine ausführbare Datei versucht. Vor allem aber habe ich es eben noch einmal überprüft :-( Allerdings ist die Perl-Version mit 5.10.0 schon ziemlich betagt. Beste Grüße Heinz -- Buchsatz für Autoren. Vom Manuskript zum Buch www.pahlke-online.de Bücher abseits des Mainstreams www.buchentdeckungen.de Barrierefreies Webdesign www.Pahlke-KunstWebDesign.de -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Fri, 08 Nov 2013, Heinz W. Pahlke schrieb:
Am Fri, 08 Nov 2013, David Haller schrieb
Seltsam. Hier klappt das im Test einwandfrei mit perl 5.14 unter oS 12.1 und 5.16 unter oS 12.3.
Hast du sicher du das '$i++;' drin hast?
Absolut sicher. Zum einen habe ich es per Copy and Paste in der Kommandozeile und zum anderen ebenfalls per Copy and Paste in eine ausführbare Datei versucht. Vor allem aber habe ich es eben noch einmal überprüft :-(
Allerdings ist die Perl-Version mit 5.10.0 schon ziemlich betagt.
Hmmm. Probier's mal mit 'my $i = 0;' statt mit 'our' im BEGIN. -dnh -- It's so nice to be insane, no one asks you to explain! -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo David, Am Sat, 09 Nov 2013, David Haller schrieb
Hmmm. Probier's mal mit 'my $i = 0;' statt mit 'our' im BEGIN.
Es ist mir ja sehr peinlich, aber in einem Anfall geistiger Umnachtung habe ich beim Copy and Paste beide Male nicht sauber gearbeitet und eine Zeile doppelt dringehabt. Und ein testweise hinzugefügtes -c hat es leider auch nicht an den Tag gebracht. Auf gut Deutsch, dein Code funktioniert natürlich auch auf meinem PC. Vielen Dank für deine Hilfe und besonders auch deine Geduld Heinz -- Buchsatz für Autoren. Vom Manuskript zum Buch www.pahlke-online.de Bücher abseits des Mainstreams www.buchentdeckungen.de Barrierefreies Webdesign www.Pahlke-KunstWebDesign.de -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Sat, 09 Nov 2013, Heinz W. Pahlke schrieb:
Am Sat, 09 Nov 2013, David Haller schrieb
Hmmm. Probier's mal mit 'my $i = 0;' statt mit 'our' im BEGIN.
Es ist mir ja sehr peinlich, aber in einem Anfall geistiger Umnachtung habe ich beim Copy and Paste beide Male nicht sauber gearbeitet und eine Zeile doppelt dringehabt.
Ich speichere bei sowas im Zweifelsfall die Mail ab und editiere diese dann (das drumrum kommentieren/löschen) ;)
Und ein testweise hinzugefügtes -c hat es leider auch nicht an den Tag gebracht.
Syntaxcheck deckt eben keine Logikfehler u.ä. auf ...
Auf gut Deutsch, dein Code funktioniert natürlich auch auf meinem PC.
Vielen Dank für deine Hilfe und besonders auch deine Geduld
Na Prima :) -dnh -- liegt es vielleicht an den lauschigen 34°, die der Prozessor oder sowas nicht mitmacht? -> Soll ich mit dem Rechner jetzt zum Baggersee rausfah- ren und ihm ne Abkühlung verpassen... [Sebastian Schulze in suse-linux] -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am 8. November 2013 21:42 schrieb Heinz W. Pahlke
<navPoint id="navPoint-38" playOrder="38">
Das ist XML. Dafür gibt's XSLT. :-) Gruß Martin -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am Fri, 08 Nov 2013, Martin Schröder schrieb
Am 8. November 2013 21:42 schrieb Heinz W. Pahlke
: <navPoint id="navPoint-38" playOrder="38">
Das ist XML. Dafür gibt's XSLT. :-)
XSLT soll aber nicht die XML-Datei verändern, sondern zielt auf die Ausgabe. Nach den Epub-Spezifikationen ist sie aber invalide und lässt sich deshalb nicht weiterverarbeiten. Beste Grüße Heinz -- Buchsatz für Autoren. Vom Manuskript zum Buch www.pahlke-online.de Bücher abseits des Mainstreams www.buchentdeckungen.de Barrierefreies Webdesign www.Pahlke-KunstWebDesign.de -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am 8. November 2013 23:06 schrieb Heinz W. Pahlke
Am Fri, 08 Nov 2013, Martin Schröder schrieb
Das ist XML. Dafür gibt's XSLT. :-)
XSLT soll aber nicht die XML-Datei verändern, sondern zielt auf die Ausgabe.
<quote src="https://en.wikipedia.org/wiki/XSLT"> XSLT (Extensible Stylesheet Language Transformations) is a language for transforming XML documents into other XML documents, </quote> BTDT.
Nach den Epub-Spezifikationen ist sie aber invalide und lässt sich deshalb nicht weiterverarbeiten.
? AFAIK ist ePuB auch XHTML, also gültiges XML. Gruß Martin -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo,
ich muss h�ufig fehlerhafte Epub-Dateien korrigieren, was meistens eine elende Tipparbeit bedeutet.
In der Datei befinden sich Eintr�ge wie:
---------------------------8<---------------------------
<navPoint id="navPoint-38" playOrder="38"> <navLabel> <text>ABC</text> </navLabel> <content src="Text/section-0039.html" /> </navPoint> --------------------------->8--------------------------
Entscheidend sind navPoint und playOrders, die fortlaufend numeriert sein m�ssen. Es d�rfen also keine Zahlen doppelt vorkommen und keine fehlen, die zusammengeh�renden navPoints und playOrders allerdings m�ssen identisch sein.
Hallo Heinz,
ich w�rde hier zu Perl tendieren
$lfdnr = 1;
while(<>)
{ if(m#<navPoint id="navPoint-\d+" playOrder="\d+">#)
{ print "
Hallo Wolfgang, Am Sat, 09 Nov 2013, hamann.w@t-online.de schrieb
ich w?rde hier zu Perl tendieren
$lfdnr = 1; while(<>) { if(m#<navPoint id="navPoint-\d+" playOrder="\d+">#) { print "
\n"; $lfdnr++; } else { print; } } Wenn das funktioniert (also perl Datei | less ein sinnvolles Ergebnis anzeigt), gibt es dann noch die M?glichkeit, ?ber Aufrufparameter alle Dateien zu bearbeiten und dabei eine Originalname.bak anzulegen
Diese Variante werde ich mir auch noch mal anschauen. Vielen Dank Heinz -- Buchsatz für Autoren. Vom Manuskript zum Buch www.pahlke-online.de Bücher abseits des Mainstreams www.buchentdeckungen.de Barrierefreies Webdesign www.Pahlke-KunstWebDesign.de -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
On Fri, November 8, 2013 21:42, Heinz W. Pahlke wrote:
Hallo,
ich muss häufig fehlerhafte Epub-Dateien korrigieren, was meistens eine elende Tipparbeit bedeutet.
In der Datei befinden sich Einträge wie:
---------------------------8<---------------------------
<navPoint id="navPoint-38" playOrder="38"> <navLabel> <text>ABC</text> </navLabel> <content src="Text/section-0039.html" /> </navPoint> <navPoint id="navPoint-38" playOrder="38"> <navLabel> <text>GHIJ</text> </navLabel> <content src="Text/section-0040.html" /> </navPoint> <navPoint id="navPoint-40" playOrder="40"> <navLabel> <text>KLM</text> </navLabel> <content src="Text/section-0041.html" /> </navPoint> <navPoint id="navPoint-43" playOrder="43"> <navLabel> <text>XYZ</text> </navLabel> <content src="Text/section-0042.html" /> </navPoint>
--------------------------->8--------------------------
Entscheidend sind navPoint und playOrders, die fortlaufend numeriert sein müssen. Es dürfen also keine Zahlen doppelt vorkommen und keine fehlen, die zusammengehörenden navPoints und playOrders allerdings müssen identisch sein.
Bei nur wenigen Einträgen korrigiere ich das einfach von Hand, aber bei 200 und mehr Einträgen macht das einfach keinen Spaß mehr.
Am besten wäre eine Lösung im vim, aber sed und Co. wären ebenfalls okay.
Hier noch die obligatorische Vim Lösung:
1) Startwert festlegen:
:let g:MyNav=1
2) Suchen und ersetzen:
g/^
Hallo, Am Mon, 11 Nov 2013, Christian Brabandt schrieb
Hier noch die obligatorische Vim Lösung: 1) Startwert festlegen: :let g:MyNav=1 2) Suchen und ersetzen: g/^
" durch die neue Variable g:MyNav ersetze und diese hinterher noch inkrementiere.
Lösungen innerhalb des vim finde ich natürlich ;-) immer am besten, weil ich manchmal in die Verlegenheit komme, unter Windows arbeiten zu müssen, ich dort aber kein perl zur Verfügung habe. Vielen Dank Heinz -- Buchsatz für Autoren. Vom Manuskript zum Buch www.pahlke-online.de Bücher abseits des Mainstreams www.buchentdeckungen.de Barrierefreies Webdesign www.Pahlke-KunstWebDesign.de -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
On Mon, November 11, 2013 21:21, Heinz W. Pahlke wrote:
Hallo,
Am Mon, 11 Nov 2013, Christian Brabandt schrieb
Hier noch die obligatorische Vim Lösung: 1) Startwert festlegen: :let g:MyNav=1 2) Suchen und ersetzen: g/^
" durch die neue Variable g:MyNav ersetze und diese hinterher noch inkrementiere. Lösungen innerhalb des vim finde ich natürlich ;-) immer am besten, weil ich manchmal in die Verlegenheit komme, unter Windows arbeiten zu müssen, ich dort aber kein perl zur Verfügung habe.
Man kann das Ganze natürlich auch über eine beliebige Anzahl an Dateien machen. Man muß dann halt nur die Variable entsprechend zurücksetzen. Das ist aber auch nur ein 5 Zeiler oder so. Außerdem läßt sich einfacher mit den regulären Ausdrücken spielen, weil man schön sieht, was gematcht wird (:set incsearch bzw :set hls). Ist mir im Zweifel lieber, als ein Perlscript, weil das kann ich einfacher rückgängig machen. In Verbindung mit persistent_undo sogar, nachdem man die Dateien bzw. Vim geschlossen hatte. Grüße, Christian -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
participants (5)
-
Christian Brabandt
-
David Haller
-
hamann.w@t-online.de
-
Heinz W. Pahlke
-
Martin Schröder