Suchen und Ersetzen im vim
Hallo, ich kämpfe wieder mal mit dem vim bzw. mit dem Suchen und Ersetzen im vim. Gegeben ist eine xml-Datei, in die Querverweise eingefügt werden müssen. Bei rund 800 Querverweisen macht das manuelle Verlinken natürlich keinen Spaß. Die zu verlinkenden Begriffe zu suchen, ist kein Problem: ↓ [[:upper:][:lower]]\+ zeigt mir alle Vorkommen von "↓ Stichwort" an. Stattdessen soll es aber heißen: ↓ <xref linkend="Stichwort"/> Mein Versuch mit :%s/↓ [\([:upper:]\)\([:lower]\)]\(\+\)/↓ /g führt zur Fehlermeldung "unmatched \)" :%s/↓ \([[:upper:][:lower]]\)\(\+\)/↓ <a xref linkend="\1\2">\1\2"\/>/g und ähnliche Varianten bringen ein "\+ follows nothing" Und nun bin ich ratlos :-(( Besten Dank schon viel hilfreiche Ratschläge 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 Thu, 26 Mar 2015, Heinz W. Pahlke schrieb
Die zu verlinkenden Begriffe zu suchen, ist kein Problem:
↓ [[:upper:][:lower:]]\+
Abgesehen von dem verlorengegangenen und oben von mir noch hinzugefügtem Doppelpunkt werden auf diese Weise doch nicht alle Worte gefunden. Wenn im Wort ein ß steht, endet die Markierung auf dem vorherigen Buchstaben. Das wäre allerdings nicht ganz so schlimm, sondern ließe sich mit zusätzlicher Handarbeit leicht beheben. 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
Hi, Am 2015-03-26 12:24, schrieb Heinz W. Pahlke:
ich kämpfe wieder mal mit dem vim bzw. mit dem Suchen und Ersetzen im vim.
Nicht aufgeben ;)
Gegeben ist eine xml-Datei, in die Querverweise eingefügt werden müssen. Bei rund 800 Querverweisen macht das manuelle Verlinken natürlich keinen Spaß.
Die zu verlinkenden Begriffe zu suchen, ist kein Problem:
↓ [[:upper:][:lower]]\+
zeigt mir alle Vorkommen von "↓ Stichwort" an.
Stattdessen soll es aber heißen:
↓ <xref linkend="Stichwort"/>
Mein Versuch mit
Das [\( sieht komisch aus. Nach [ können keine Gruppierungen kommen. :%s/↓ \([[:upper:]]\)\([[:lower]]\)\(.\+\)/↓ /g Je nachdem, was in der dritten Gruppe stehen kann, muß man das noch entsprechend definieren.
führt zur Fehlermeldung "unmatched \)"
Jo, das kommt vom \( in der []
:%s/↓ \([[:upper:][:lower]]\)\(\+\)/↓ <a xref linkend="\1\2">\1\2"\/>/g
und ähnliche Varianten bringen ein "\+ follows nothing"
Ja, vor dem \+ muß noch was stehen. Also "was" kommt denn mindestens einmal vor? 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
Hallo, Am Thu, 26 Mar 2015, Christian Brabandt schrieb
Am 2015-03-26 12:24, schrieb Heinz W. Pahlke:
Das [\( sieht komisch aus. Nach [ können keine Gruppierungen kommen.
:%s/↓ \([[:upper:]]\)\([[:lower:]]\)\(.\+\)/↓ /g
Je nachdem, was in der dritten Gruppe stehen kann, muß man das noch entsprechend definieren.
Da mit dieser Zeile viel zu viel in das linkend gepackt wird, muss die dritte Gruppe noch falsch sein. Erst einmal mein Verständnis des Suchbegriffs: [:upper:] sucht nach Großbuchstaben, [:lower:] nach Kleinbuchstaben. Allerdings jeweils nur nach einmaligem Vorkommen. Um das gesamte Wort zu markieren, habe ich das \+ hinzugefügt.
und ähnliche Varianten bringen ein "\+ follows nothing"
Ja, vor dem \+ muß noch was stehen. Also "was" kommt denn mindestens einmal vor?
So viele beliebige kleine Buchstaben, bis das Wortende erreicht ist. 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 2015-03-26 13:34, schrieb Heinz W. Pahlke:
Am Thu, 26 Mar 2015, Christian Brabandt schrieb
Am 2015-03-26 12:24, schrieb Heinz W. Pahlke:
Das [\( sieht komisch aus. Nach [ können keine Gruppierungen kommen.
:%s/↓ \([[:upper:]]\)\([[:lower:]]\)\(.\+\)/↓ /g
Je nachdem, was in der dritten Gruppe stehen kann, muß man das noch entsprechend definieren.
Da mit dieser Zeile viel zu viel in das linkend gepackt wird, muss die dritte Gruppe noch falsch sein.
Erst einmal mein Verständnis des Suchbegriffs:
[:upper:] sucht nach Großbuchstaben, [:lower:] nach Kleinbuchstaben. Allerdings jeweils nur nach einmaligem Vorkommen. Um das gesamte Wort zu markieren, habe ich das \+ hinzugefügt.
Ja, aber es ist [[:upper:]] und [[:lower:]] (doppelte eckige Klammern). Dein [:upper:] sucht nach 1 Zeichen von entweder ':' oder 'u' oder 'p' oder 'r' Einfacher ist übrigens meist \u und \l
und ähnliche Varianten bringen ein "\+ follows nothing"
Ja, vor dem \+ muß noch was stehen. Also "was" kommt denn mindestens einmal vor?
So viele beliebige kleine Buchstaben, bis das Wortende erreicht ist.
Also so? :%s/↓ \(\u\l\+\)\>/↓ /g Das \> stellt sicher, dass es an Wortgrenzen aufhört zu matchen. 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
Hallo, Am Thu, 26 Mar 2015, Christian Brabandt schrieb
Einfacher ist übrigens meist \u und \l
[...]
Danke, tut schon fast, was es soll. Auf [:upper:] und [:lower:] war ich nur gekommen, weil sonst die deutschen Umlaute nicht gefunden werden. Aber vermutlich ist es einfacher, die nicht gefundenen Stichworte einfach per Hand zu bearbeiten. Vielen Dank jedenfalls, einen Großteil der Arbeit erspart mir deine Hilfe auf jeden Fall. 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 Thu, 26 Mar 2015 13:50, Heinz W. Pahlke
Hallo,
Am Thu, 26 Mar 2015, Christian Brabandt schrieb
Einfacher ist übrigens meist \u und \l
[...]
Danke, tut schon fast, was es soll.
Auf [:upper:] und [:lower:] war ich nur gekommen, weil sonst die deutschen Umlaute nicht gefunden werden.
Aber vermutlich ist es einfacher, die nicht gefundenen Stichworte einfach per Hand zu bearbeiten.
Vielen Dank jedenfalls, einen Großteil der Arbeit erspart mir deine Hilfe auf jeden Fall.
dann erweitere \u und \l selber: "\u" zu "[\uÜÖÄ]" und "\l" zu "[\lüöäß]" selbst so ist es immer noch einfacher zu lesen und mit weniger Fehlerquellen belastet als "[[:upper:]]" und "[[:lower:]]" Mit den doppelten eckigen Klammern, und den Doppelpunkten kommt man leicht aus dem Tritt. - Yamaban
Am 2015-03-26 13:58, schrieb Yamaban:
On Thu, 26 Mar 2015 13:50, Heinz W. Pahlke
wrote: Hallo,
Am Thu, 26 Mar 2015, Christian Brabandt schrieb
Einfacher ist übrigens meist \u und \l
[...]
Danke, tut schon fast, was es soll.
Auf [:upper:] und [:lower:] war ich nur gekommen, weil sonst die deutschen Umlaute nicht gefunden werden.
Aber vermutlich ist es einfacher, die nicht gefundenen Stichworte einfach per Hand zu bearbeiten.
Vielen Dank jedenfalls, einen Großteil der Arbeit erspart mir deine Hilfe auf jeden Fall.
dann erweitere \u und \l selber:
"\u" zu "[\uÜÖÄ]" und "\l" zu "[\lüöäß]"
Äh nein. [\löüäß] sucht nach einem Zeichen aus der Menge '\', 'l', 'ü', 'ö', 'ä', 'ß' Das ist wohl nicht gemeint ;)
selbst so ist es immer noch einfacher zu lesen und mit weniger Fehlerquellen belastet als "[[:upper:]]" und "[[:lower:]]"
In dem Fall ist wohl [[:upper:]] bzw. [[:lower:]] tatsächlich einfacher. Oder [a-zäöüß] oder so. Möglichkeiten gibt es viele. 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
Hallo, Am Thu, 26 Mar 2015, Yamaban schrieb
dann erweitere \u und \l selber:
"\u" zu "[\uÜÖÄ]" und "\l" zu "[\lüöäß]"
Das geht leider nicht. So etwas Ähnliches hatte ich ziemlich gleich am Anfang schon bei der Suche probiert. 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 26.03.2015 13:34, schrieb Heinz W. Pahlke:
Hallo,
Am Thu, 26 Mar 2015, Christian Brabandt schrieb
Am 2015-03-26 12:24, schrieb Heinz W. Pahlke:
Das [\( sieht komisch aus. Nach [ können keine Gruppierungen kommen.
:%s/↓ \([[:upper:]]\)\([[:lower:]]\)\(.\+\)/↓ /g
Je nachdem, was in der dritten Gruppe stehen kann, muß man das noch entsprechend definieren.
Da mit dieser Zeile viel zu viel in das linkend gepackt wird, muss die dritte Gruppe noch falsch sein.
Erst einmal mein Verständnis des Suchbegriffs:
[:upper:] sucht nach Großbuchstaben, [:lower:] nach Kleinbuchstaben. Allerdings jeweils nur nach einmaligem Vorkommen. Um das gesamte Wort zu markieren, habe ich das \+ hinzugefügt.
und ähnliche Varianten bringen ein "\+ follows nothing"
Ja, vor dem \+ muß noch was stehen. Also "was" kommt denn mindestens einmal vor?
So viele beliebige kleine Buchstaben, bis das Wortende erreicht ist.
Beste Grüße
Heinz
Hi,
also, vim ist ja nicht so mein Ding... aber mit sed - und die Syntax
beim vim ist ja wohl die von sed - kommt da bei mir
sed -e 's/↓ \([[:upper:]][[:lower:]]\+\)/↓ <a xref linkend="\1">/g'
Am 26.03.2015 14:04, schrieb Joerg Thuemmler:
Am 26.03.2015 13:34, schrieb Heinz W. Pahlke:
Hallo,
Am Thu, 26 Mar 2015, Christian Brabandt schrieb
Am 2015-03-26 12:24, schrieb Heinz W. Pahlke:
Das [\( sieht komisch aus. Nach [ können keine Gruppierungen kommen.
:%s/↓ \([[:upper:]]\)\([[:lower:]]\)\(.\+\)/↓ /g
Je nachdem, was in der dritten Gruppe stehen kann, muß man das noch entsprechend definieren.
Da mit dieser Zeile viel zu viel in das linkend gepackt wird, muss die dritte Gruppe noch falsch sein.
Erst einmal mein Verständnis des Suchbegriffs:
[:upper:] sucht nach Großbuchstaben, [:lower:] nach Kleinbuchstaben. Allerdings jeweils nur nach einmaligem Vorkommen. Um das gesamte Wort zu markieren, habe ich das \+ hinzugefügt.
und ähnliche Varianten bringen ein "\+ follows nothing"
Ja, vor dem \+ muß noch was stehen. Also "was" kommt denn mindestens einmal vor?
So viele beliebige kleine Buchstaben, bis das Wortende erreicht ist.
Beste Grüße
Heinz
Hi,
also, vim ist ja nicht so mein Ding... aber mit sed - und die Syntax beim vim ist ja wohl die von sed - kommt da bei mir
sed -e 's/↓ \([[:upper:]][[:lower:]]\+\)/↓ <a xref linkend="\1">/g'
raus. Ich habe mal das ↓ mittels » simuliert, weil ich das auf meiner Tastatur nicht habe:
Datei test.txt:
» Test;ß442952 » Messen:dfwqfjwfj133 jajdklajdkla » undß » Oderdaßdu+kdqkljkl #dqwfgjg » Nee? » Nana!
sed -e 's/» \([[:upper:]][[:lower:]]\+\)/» <a xref linkend="\1">/g'
Ergebnis:
» Test;ß442952 » Messen:dfwqfjwfj133 jajdklajdkla » undß » Oderdaßdu+kdqkljkl #dqwfgjg » Nee? » Nana!
wenn der vim damit nicht klarkommt, nimm doch gleich sed.
cu jth
Sorry, das war das falsche Ergebnis (copy+paste-Fehler), hier nun richtig: » <a xref linkend="Test">;ß442952 » <a xref linkend="Messen">:dfwqfjwfj133 jajdklajdkla » undß » <a xref linkend="Oderdaßdu">+kdqkljkl #dqwfgjg » <a xref linkend="Nee">? » <a xref linkend="Nana">! kommt auch mit ß klar ... zumindest bei mir, auch mit Umlauten. [[:upper:]][[:lower:]]\+ sollte jedes Wortende jedes groß geschriebenen Wortes finden... cu jth -- www.teddylinx.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 2015-03-26 14:04, schrieb Joerg Thuemmler:
also, vim ist ja nicht so mein Ding... aber mit sed - und die Syntax beim vim ist ja wohl die von sed - kommt da bei mir
Ja, bzw. erweitert um viele Möglichkeiten mehr, die mit sed nicht gehen (look around assertions, matching von newlines, Cursorposition, Evaluierung des gematchen Teils, etc..)
sed -e 's/↓ \([[:upper:]][[:lower:]]\+\)/↓ <a xref linkend="\1">/g'
raus. Ich habe mal das ↓ mittels » simuliert, weil ich das auf meiner Tastatur nicht habe:
Das war aber nicht die Frage. So funktioniert das in Vim ja auch. Mich wundert nur gerade, dass \l in einer deutschen Lokale tatsächlich was anderes matched (nämlich ausschließlich der umlaute) als [[:lower:]] 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
Am 26.03.2015 14:19, schrieb Christian Brabandt:
Am 2015-03-26 14:04, schrieb Joerg Thuemmler:
also, vim ist ja nicht so mein Ding... aber mit sed - und die Syntax beim vim ist ja wohl die von sed - kommt da bei mir
Ja, bzw. erweitert um viele Möglichkeiten mehr, die mit sed nicht gehen (look around assertions, matching von newlines, Cursorposition, Evaluierung des gematchen Teils, etc..)
naja, ab einer bestimmten Härte versuche ich dann, an bessere Daten zu kommen ;-)
sed -e 's/↓ \([[:upper:]][[:lower:]]\+\)/↓ <a xref linkend="\1">/g'
raus. Ich habe mal das ↓ mittels » simuliert, weil ich das auf meiner Tastatur nicht habe:
Das war aber nicht die Frage. So funktioniert das in Vim ja auch.
Mich wundert nur gerade, dass \l in einer deutschen Lokale tatsächlich was anderes matched (nämlich ausschließlich der umlaute) als [[:lower:]]
Grüße, Christian
keine Ahnung. Ich nehme schon seit UnixSystemVR4 Zeichenklassen. Damit habe ich noch nie Ärger gehabt. Diese ganzen \l \u und so weiter sehen, wenn man ohnehin noch ein paar \ braucht, schnell unübersichtlich aus... Ansichtssache natürlich... cu jth -- www.teddylinx.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 2015-03-26 14:32, schrieb Joerg Thuemmler:
Am 26.03.2015 14:19, schrieb Christian Brabandt:
Am 2015-03-26 14:04, schrieb Joerg Thuemmler:
also, vim ist ja nicht so mein Ding... aber mit sed - und die Syntax beim vim ist ja wohl die von sed - kommt da bei mir
Ja, bzw. erweitert um viele Möglichkeiten mehr, die mit sed nicht gehen (look around assertions, matching von newlines, Cursorposition, Evaluierung des gematchen Teils, etc..) naja, ab einer bestimmten Härte versuche ich dann, an bessere Daten zu kommen ;-)
Ich versteh nicht, was du sagen möchtest.
sed -e 's/↓ \([[:upper:]][[:lower:]]\+\)/↓ <a xref linkend="\1">/g'
raus. Ich habe mal das ↓ mittels » simuliert, weil ich das auf meiner Tastatur nicht habe:
Das war aber nicht die Frage. So funktioniert das in Vim ja auch.
Mich wundert nur gerade, dass \l in einer deutschen Lokale tatsächlich was anderes matched (nämlich ausschließlich der umlaute) als [[:lower:]]
keine Ahnung. Ich nehme schon seit UnixSystemVR4 Zeichenklassen. Damit habe ich noch nie Ärger gehabt.
Zeichenklassen waren schon immer locale abhängig.
Diese ganzen \l \u und so weiter sehen, wenn man ohnehin noch ein paar \ braucht, schnell unübersichtlich aus... Ansichtssache natürlich...
Dafür gibt es übrigens das flag \V (very magic). Damit spart man sich einen Großteil der '\' und das ist meist besser lesbar. Das scheint auch die Mehrzahl der Vim Poweruser zu bevorzugen, wenn man den entsprechenden Foren und Mailinglisten glauben darf. 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
Am 26.03.2015 14:38, schrieb Christian Brabandt:
Am 2015-03-26 14:32, schrieb Joerg Thuemmler:
Am 26.03.2015 14:19, schrieb Christian Brabandt:
Am 2015-03-26 14:04, schrieb Joerg Thuemmler:
also, vim ist ja nicht so mein Ding... aber mit sed - und die Syntax beim vim ist ja wohl die von sed - kommt da bei mir
Ja, bzw. erweitert um viele Möglichkeiten mehr, die mit sed nicht gehen (look around assertions, matching von newlines, Cursorposition, Evaluierung des gematchen Teils, etc..) naja, ab einer bestimmten Härte versuche ich dann, an bessere Daten zu kommen ;-)
Ich versteh nicht, was du sagen möchtest.
Dass es mir zu anstrengend ist, obige Funktionen zu erlernen. ;-)
sed -e 's/↓ \([[:upper:]][[:lower:]]\+\)/↓ <a xref linkend="\1">/g'
raus. Ich habe mal das ↓ mittels » simuliert, weil ich das auf meiner Tastatur nicht habe:
Das war aber nicht die Frage. So funktioniert das in Vim ja auch.
Mich wundert nur gerade, dass \l in einer deutschen Lokale tatsächlich was anderes matched (nämlich ausschließlich der umlaute) als [[:lower:]]
keine Ahnung. Ich nehme schon seit UnixSystemVR4 Zeichenklassen. Damit habe ich noch nie Ärger gehabt.
Zeichenklassen waren schon immer locale abhängig.
Diese ganzen \l \u und so weiter sehen, wenn man ohnehin noch ein paar \ braucht, schnell unübersichtlich aus... Ansichtssache natürlich...
Dafür gibt es übrigens das flag \V (very magic). Damit spart man sich einen Großteil der '\' und das ist meist besser lesbar. Das scheint auch die Mehrzahl der Vim Poweruser zu bevorzugen, wenn man den entsprechenden Foren und Mailinglisten glauben darf.
Grüße, Christian
Ich werde bestimmt kein "Vim Poweruser" mehr auf meine alten Tage, ich benutze seit gefühlten Jahrhunderten Norton|Midnight Commander. Ist immer mein erster Klick bei der Softwareauswahl... Für Sinix habe ich mir mal eine - zugegeben nicht ganz vollständige - Version davon in C selbst geschrieben ;-) cu jth -- www.teddylinx.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 Thu, 26 Mar 2015, Joerg Thuemmler schrieb
sed -e 's/↓ \([[:upper:]][[:lower:]]\+\)/↓ <a xref linkend="\1">/g'
Hervorragend. Das funktioniert zudem auch im vim. Allerdings ergeben beide ein geringfügig unterschiedlich große Datei. Ich muss jetzt mal mit xxdiff schauen, wo die Unterschiede liegen. Vielen Dank jedenfalls 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
participants (4)
-
Christian Brabandt
-
Heinz W. Pahlke
-
Joerg Thuemmler
-
Yamaban