"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