"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