"Mustersuche" Sven Guckes Sa 2007-03-24 FH Augsburg === Abstract Bei der Bearbeitung von Texten sucht man immer wieder mal nach einem Wort... aber man findet es nicht, weil man sich bei der gross/Kleinschreibung vertippt hat. Ein paar Programme erlauben bei der Suche die Schreibung zu ignorieren. Aber wir findet man ein Wort, wenn es nur am Anfang oder am Ende der Zeile steht? Und wie ersetzt man ein Wort, wenn es in einer kommentierten Zeile vorkommt? Das alles kann man mit einer einfachen Sprache lösen: Die Sprache der Muster, auch reguläre Ausdrücke genannt. Die Theorie ist grau, aber dieser Vortrag gibt ein paar Beispiele aus dem Alltag, die recht häufig auftreten. === Zielgruppe: Einsteiger Szenario: Koexistenz von freier Software auf Windows und Linux am Beispiel des Editors "vim". === Event Linux Info-Tag Augsburg http://www.guckes.net/augsburg2007/vortrag.mustersuche.html 6. Linux-Infotag an der FH Augsburg, Fachbereich Informatik Sa, 24.März 9-16h Themenschwerpunkt: "Linux als starker Desktop" http://www.luga.de/Aktuelles/LIT-2007/ === Suchen: Suche nach einem Wort: /Wort Suche nach "wort": /wort Suche nach "wort" oder "Wort" am Anfang einer Zeile: /^Wort Suche nach "wort" oder "Wort" am Anfang einer Zeile: /Wort$ Suche nach einer Zeile, die *nur* "Wort" enthaelt: /^Wort$ Suche nach einer leeren Zeile: /^$ Jetzt wird es "bunt": :set hls === Buchstabensuppe *ein* Buchstabe aus einer Buchstabenmenge: zB ein Vokal: [aeiou] Komplementaermenge: [^aeiou] === gross oder klein Suche nach "wort" oder "Wort": /[wW]ort === Numeratoren ? {0,1} 0mal oder 1mal * {0,} 0mal oder mehr + {1,} 1mal oder mehr Konvention: Laengster Treffer gewinnt. Achtung: ".*" ist *sehr* "gefraessig"! === Suchen+Ersetzen substitution aka search+replace :%s/such/ersatz/g Erklaerung: : Wechsel zur Kommandzeile % "in allen Zeilen" s substitutiere (ersetze) / Beginn des Suchmusters such das Suchmuster / Ende des Suchmusters und Beginn der Ersetzung ersatz der Ersatz / Ende des Ersatz g "global" - *alle* Treffer (matches) in Zeilen ersetzen Bemerkung: Das Trennnungszeichen '/' (backslash) nach dem Befehl 's' kann fast beliebig gewaehlt werden. zB die folgenden Zeichen: [_.,;:-+='"~^!] warnung: Ohne das Flag 'g' wird jeweils nur der *erste* Treffer in jeder Zeile ersetzt. "feature!" Jedes "wort" durch "Wort" ersetzen: :%s,wort,Wort,g Anfügen, Vorfügen, Verdoppeln: :%s/foo/bar&/ -> barfoo :%s/foo/&bar/ -> foobar :%s/foo/&&/ -> foofoo Kommentare löschen: :%s/#.*// === Spezielle Muster \d digit [0-9] \d non-digit [^0-9] \s whitespace Leerzeichen oder Tab \S non-whitespace weder Leerzeichen noch Tab \w word char [0-9A-Za-z_] \W non-work char [^0-9A-Za-z_] -> :help /character-classes === global command "Operate on all matching lines", dh ein Ausfuehren eines Kommandos auf allen "passenden" Zeilen. :g/Muster/Kommando Kommando 'p' -> print Idee: "alle Zeilen, die ein gegebenes Muster enthalten, ausgeben" Ausgabe aller passenden Zeilen auf dem Bildschirm: :g/wort/p allgemein geschrieben: :g/RE/p daraus wurde dann ein eigenes Kommando: "grep" :-) Zeilen ausgeben mit Numerierung: :g/RE/nu weitere Kommandos: :g/RE/co $ copy - kopiere alle RE enthaltenden Zeilen ans Ende des Puffers :g/RE/mo $ move - verschiebe alle RE enthaltenden Zeilen ans Ende des Puffers :g/RE/ya a yank - kopiere alle RE enthaltenden Zeilen ins Register 'a' - mit Ueberschreiben :g/RE/ya A yank - kopiere alle RE enthaltenden Zeilen ins Register 'a' - mit Anfuegen Den Inhalt von Register 'a' einfuegen (nach der aktuellen Zeile): "ap === :g + :s zusammen In allen Zeilen, die "echo" enthalten, den Anfang der Zeile mit '#' ersetzen: :g/echo/s/^/#/ Alle passenden Zeilen. werden also "kommentiert". Andereseits kann man Text auch nur in komemntierten Zeilen aendern: :g/^#/s:foo:bar: Eventuell befinden sich vor dem Kommentarzeichen noch Leerzeichen (whitespace): :g/^\s*#/s:foo:bar: === grep Ein paar nuetzliche Optionen von grep: grep -h : grep -i ... "-i": Gross/Kleinschreibung ignorieren: grep -i : grep -i gnu # GNU? Gnu? gnu? "-l": "liste" der Dateinamen mit mindestens einem Treffer: grep -l : ls -l `grep -l Herford *` "-n": "number". Zeilennummern angeben: grep -n : grep bash /etc/passwd "--color": Treffer mit Farbe hervorheben: grep --color=always foo files... | less -r === see also weitere programme, die REs verwenden: awk less mutt perl sed vi vim OpenOffice (noch mal nachguckes) globbing: bash zsh xephem - siehe Vortrag von Carl Wenninger! === Glossar Muster -> regular expression aka RE passende Zeilen -> Zeilen, die ein gegebenes Muster enthalten. Treffer -> genau der Teil, der auf ein gegebenes Muster zutrifft === TODO: Beispieltexte! Letzte Änderung: Wed Feb 28 01:15:00 CET 2007