• Keine Ergebnisse gefunden

Reguläre Ausdrücke, Texteditoren

N/A
N/A
Protected

Academic year: 2021

Aktie "Reguläre Ausdrücke, Texteditoren"

Copied!
8
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Foliensatz 6

Reguläre Ausdrücke, Texteditoren

Inhalt

• Was sind Reguläre Ausdrücke?

• Syntax von regulären Ausdrücken

• Befehle, die reguläre Ausdrücke nutzen

• Texteditoren

Reguläre Ausdrücke

• Reguläre Ausdrücke (kurz Regex oder Regexp) sind Zeichenketten, die eine Menge von Zeichenketten beschreiben.

Sie werden z.B. zum Analysieren von Zeichenketten benutzt (Mustererkennung) oder um Zeichenketten innerhalb eines Textes zu finden und eventuell zu bearbeiten (suchen und ersetzen).

• Reguläre Ausdrücke werden nicht nur auf der Kommandozeile in einigen Programmen (bash, grep, sed, awk, vim, …) benutzt, sie sind auch in nahezu allen Programmiersprachen (z.B. Ruby, Perl, Java, C, …) verfügbar und sehr hilfreich.

• Es gibt viele unterschiedliche Implementierungen von regulären Ausdrücken, wir behandeln die Grundsyntax (erweiterte reguläre Ausdrücke), die praktisch von allen Implementierungen unterstützt wird. Es gibt auch einen POSIX-Standard für reguläre Ausdrücke (siehe man 7 regex).

Reguläre Ausdrücke - Struktur

• Bei der Analyse eines Regex ist es sinnvoll, den Regex zuerst als Ganzes zu betrachten und ihn dann in seine Teile zu zerlegen, wobei jeder Teil ein selbständiger Regex ist.

• Ein regulärer Ausdruck besteht aus Zeichen, von denen einige eine spezielle Bedeutung haben (ähnlich wie die speziellen Zeichen der Shell).

• Um die Analyse durchführen zu können, muss man die Bedeutung der speziellen Zeichen verstehen und wissen, wie sie angewendet werden können.

• Grob gesagt besteht ein Regex aus

• einer oder mehreren Alternativen (durch | getrennt) und

• jede Alternative aus mehreren, sequentiell abgearbeiteten Stücken.

Ein Stück ist entweder

• ein gewöhnliches Zeichen, eine Zeichenklasse, eine Gruppierung oder eine Referenz, welche optional von einem Quantor gefolgt werden können, oder

• ein Anker.

(2)

Reguläre Ausdrücke - Zeichen

• Jedes (gewöhnliche) Zeichen steht grundsätzlich für sich selbst, außer es hat eine spezielle Bedeutung.

• Das Zeichen . (der Punkt) steht für ein beliebiges Zeichen.

• Unter anderem haben folgende Zeichen eine spezielle Bedeutung und müssen deshalb mit Hilfe von

\ maskiert werden:

. * + ? [ ] ( ) | \ ^ $

Das heißt, . steht für ein beliebiges Zeichen, \. für den Punkt.

Reguläre Ausdrücke - Zeichenklassen

Zeichenklassen sind eine Zusammenfassung verschiedener Zeichen, die an genau einer Stelle stehen können, und werden mit Hilfe von eckigen Klammern definiert (z.B. [abcd]). Zeichenbereiche können durch einen Bindestrich angegeben werden (z.B. [a-zA-Z0-9]).

Steht an erster Stelle ein Zirkumflex ^, wird die Zeichenklasse invertiert (d.h. an der Stelle darf jedes Zeichen außer denen in der Zeichenklasse stehen).

• Es gibt auch vordefinierte Zeichenklassen. Diese können sowohl innerhalb der eckigen Klammern als auch außerhalb verwendet werden, zB.:

• \d → eine Ziffer (entspricht [0-9])

• \D → obige Klasse negiert

• \w → ein alphanumerisches Zeichen oder der Unterstrich (entspricht [a-zA-Z0-9_])

• \W → obige Klasse negiert

• \s → „Whitespace“, d.h. Leerzeichen, Tabulator, Zeilenumbruch, Wagenrücklauf, …

• \S → obige Klasse negiert

Reguläre Ausdrücke - Quantoren

Quantoren geben an, wie oft der Ausdruck vor ihnen wiederholt werden soll:

• ? → Ausdruck kann einmal oder keinmal vorkommen (entspricht {0,1})

• + → Ausdruck kommt einmal oder mehrmals vor (entspricht {1,})

• * → Ausdruck kommt keinmal, einmal oder mehrmals vor (entspricht {0,})

• {n} → Ausdruck kommt genau n-mal vor

• {n,} → Ausdruck kommt mindestens n-mal vor

• {,m} → Ausdruck kommt maximal m-mal vor

• {n,m}→ Ausdruck kommt mindestens n-mal und maximal m-mal vor

Quantoren sind gierig, d.h. sie versuchen immer die maximale Anzahl an übereinstimmenden Zeichen zu finden. In vielen Implementierungen kann man ein ? an einen beliebigen Quantor anhängen, um die Quantoren genügsam zu machen, damit sie die minimale Anzahl an übereinstimmenden Zeichen finden.

(3)

Reguläre Ausdrücke - Gruppierungen, Referenzen

• Ausdrücke kann man mit runden Klammern (...) gruppieren. Will man Ausdrücke gruppieren, um z.B. darauf einen Quantor anzuwenden, ohne die Gruppierung später zu verwenden, so benutzt man (?:...). Das erzeugt eine sogenannte non-capturing Gruppierung.

• Auf Gruppierungen kann man sich später mit Hilfe von Referenzen beziehen (außer auf die non- capturing Gruppierungen). Für Referenzen benutzt man \1, \2, usw. für die erste Gruppe, die zweite Gruppe usw.

Reguläre Ausdrücke - Alternativen, Anker

• Es gibt auch die Möglichkeit, den regulären Ausdruck in zwei Alternativen aufzuteilen. Dazu benutzt man |. Will man nur einen Teil des Ausdrucks in zwei Alternativen aufteilen, so muss Gruppierungen verwenden.

• Zu guter Letzt gibt es sogenannte Anker, die es erlauben, einen regulären Ausdruck an eine bestimmte Stelle zu fixieren:

• \A → Anfang der Zeichenkette

• ^ → Anfang der Zeichenkette oder Zeilenanfang (nach Zeilenumbruch)

• $ → Ende der Zeichenkette oder Zeilenende (vor Zeilenumbruch)

• \Z → Ende der Zeichenkette (vor optionalen Zeilenumbruch)

• \z → Ender der Zeichenkette

• \b → Wortrand (Wortanfang oder Wortende)

• \B → kein Wortrand (kein Wortanfang und kein Wortende)

Reguläre Ausdrücke - Beispiele

Als Beispielzeichenkette verwenden wir folgenden Text:

STRING1 Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt) STRING2 Mozilla/4.75 [en](X11;U;Linux2.2.16-22 i586)

• .* → alles

• \[en\] → die Zeichenfolge [en]

• [A-Z]+ → Folgen von Großbuchstaben

• \w+;\s? → Wort, gefolgt von einem Strichpunkt und optionalem Whitespace

• \d{3,} → Ziffernfolgen mit mindestens drei Ziffern

• (\w)\1 → doppelte Wortzeichen

• (l).*?\1 → das Zeichen „l“, gefolgt von beliebigen Zeichen bis zum nächsten „l“

• ^\w+ → alle Wörter, die am Zeilenanfang vorkommen

• \b[a-z]+\b → kleingeschriebene Wörter

• i(ll|bl)[ae] → das Zeichen „i“, gefolgt von „ll“ oder „bl“, gefolgt von „a“ oder „e“

Siehe auch man pcresyntax, man pcrepattern, Regulärer Ausdruck auf Wikipedia, RegExr bzw. Online Regex Tester.

(4)

Befehle (grep)

grep - Filtert Zeilen aus Dateien mittels regulärem Ausdruck.

» Standardmäßig werden die gefundenen Zeilen ausgegeben, ist konfigurierbar.

» Der Rückgabewert ist 0, falls Zeilen gefunden wurden und sonst 1 (bei Fehler 2).

» Optionen: -E → erweiterte reguläre Ausdrücke verwenden, -i → Groß-/Kleinschreibung ignorieren, -r → Verzeichnisse rekursiv durcharbeiten, -n → Zeilenummer anzeigen, -H → Dateiname anzeigen, -q → nichts ausgeben, --color → gefunden Zeichenketten farbig markieren.

» $ grep root /etc/passwd

root:x:0:0:root:/root:/bin/bash

$ grep '^\w+:x:15' /etc/passwd

$ grep -E '^\w+:x:15' /etc/passwd

thomas:x:1515:1515:thomas,,,:/home/thomas:/bin/bash

Befehle (sed)

sed - Hilfswerkzeug zum Filtern und Transformieren von Text.

» Mit Hilfe einer eigenen Skriptsprache kann man Text filtern und transformieren. Das Programm ermöglicht dadurch einen sehr universellen Einsatz.

» Optionen: -e Skript → Angabe des Skripts, das benutzt werden soll, -n → Ausgabe nur, wenn explizit angegeben, -r → erweiterte, reguläre Ausdrücke benutzen.

» $ grep bash /etc/passwd | sed -ne 's/\/bash$/\/zsh/'

$ grep bash /etc/passwd | sed -ne 's/\/bash$/\/zsh/p' root:x:0:0:root:/root:/bin/zsh

thomas:x:1515:1515:thomas,,,:/home/thomas:/bin/zsh

$ grep bash /etc/passwd | sed -ne '1s/\/bash$/\/zsh/p' root:x:0:0:root:/root:/bin/zsh

thomas:x:1515:1515:thomas,,,:/home/thomas:/bin/bash

$ sed -re '/bin\/(false|sh)/d;1d;s/\/bash$/\/zsh/' /etc/passwd sync:x:4:65534:sync:/bin:/bin/sync

thomas:x:1515:1515:thomas,,,:/home/thomas:/bin/zsh sshd:x:121:65534::/var/run/sshd:/usr/sbin/nologin

$ sed -ne '5,6p' /etc/passwd # einfacher als die Kombination aus head und tail sync:x:4:65534:sync:/bin:/bin/sync

games:x:5:60:games:/usr/games:/bin/sh

» Für mehr Informationen/Beispiele siehe info sed Examples und sed Einzeiler

Textdateien editieren

Ein wichtiges Handwerkszeug auf der Kommandozeile ist ein guter Texteditor.

Nano: Kompakter, einfach zu bedienender Editor. Standard in Ubuntu.

Emacs: Sehr mächtiger Editor; programmierbar in Lisp für Erweiterungen; gut für Terminal und GUI.

Vi/Vim: Ebenfalls sehr mächtiger, aber gewöhnungsbedürftiger Editor; schnell, relativ alt, sehr gut für Terminals (aber auch GUI), nahezu überall installiert. Standard in den meisten Linux Distributionen.

Der Default-Editor unter Ubuntu kann mit Hilfe des folgenden Befehls geändert werden:

$ sudo update-alternatives --config editor

(5)

Textdateien editieren - Nano

Das Interface von Nano besteht aus drei Teilen:

• Statuszeile oben

• Dem zu editierenden Text in der Mitte

• Menü mit Shortcuts unten (^ steht für die Strg-Taste und M- für die Alt-Taste) Die wichtigsten Tastenkombinationen:

• Strg-O → Speichern der Datei

• Strg-X → Beenden von Nano

• Strg-G → Hilfe anzeigen

Textdateien Editieren - Emacs

Seit 1976 (Richard Stallman), über 1000 Funktionen + Makros. Emacs basiert auf Lisp und kann mit zahlreichen Modulen erweitert werden. Aktuelle Version ist 24.5.

Es gibt keine verschiedenen Modi wie bei Vim, sondern die Strg-Taste (C-) und die Alt-Taste (M-) werden für Befehle genutzt:

• C-x b → Buffer wechseln oder neuen Buffer erzeugen (mehrere gleichzeitig, in mehreren Fenstern)

• C-x C-f/C-x C-s → Datei öffnen/speichern

• C-x C-c → Beenden (bei nicht gespeicherten Dateien wird nachgefragt)

• C-s/C-r → Vorwärts/Rückwärts suchen

• C-f/C-b bzw. M-f/M-b → Ein Zeichen bzw. Wort vorwärts/rückwärts

• C-Space → Startmarkierung setzen

• C-w/M-w → Bereich von Startmarkierung bis Cursor ausschneiden/kopieren

• C-y → Kopierten/Ausgeschnittenen Text einfügen

• C-_ → Undo

Dreimaliges Drücken der Escape-Taste bricht eine angefangene Aktion ab.

Textdateien editieren - Vim

Ursprungsform ist vi, 1976 von Bill Joy geschrieben. Mehr Funktionalität bietet Vim, z.B. viele Plugins und eine graphische Oberfläche (GVim).

Vim arbeitet mit mehreren Betriebsmodi:

Normaler Modus: Man kann lesen, suchen, editieren, … In diesen Modus kommt man immer, wenn man die Escape-Taste drückt. Tastendrücke (auch Buchstaben) sind (Navigations-/Editier-)befehle!

Kommandozeilenmodus: Eingabe von beliebigen Befehlen.

Eingabemodus: Einfügen von Text an der Stelle des Cursors.

Visueller Modus: Es können Bereiche (Zeichen, Zeilen, Blöcke) markiert werden und dann Befehle auf diesen Bereichen ausgeführt werden (z.B. Kopieren, Löschen, blockweises Einfügen, …).

Vim besitzt einen eingebauten Übungsmodus, der mit Hilfe des Befehls vimtutor gestartet werden kann!

(6)

Links: Vim Tips Wiki, Best Vim Tips, Buchempfehlung: Practical Vim

Vim - Normaler Modus

Cursor bewegen: Pfeiltasten oder

• h/j/k/l → Zeichen nach links, Zeile hinunter, Zeile hinauf, Zeichen nach rechts

• 0 → Zum Zeilenanfang

• ^ → Zum ersten Zeichen der Zeile, dass kein Leerzeichen ist

• $ → Zum Zeilenende

• w/b → Zum Anfang des nächsten/vorherigen Wortes

• e → Zum Ende des nächsten Wortes

• gg/G → Zur ersten bzw. letzten Zeile des Textes springen

Befehle werden kombiniert nach dem Schema „[Zahl=Wiederholungen] Befehl<Objekt/Bewegung>“:

• d[i]w → Wort löschen, dd → ganze Zeile löschen (ebenso mit c für ändern)

• 5dw → 5 Wörter löschen, 4j → 4 Zeilen runter

• u → Undo, Strg-r → Redo

Vim - Kommandozeile

Benutzen der Kommandozeile mittels : (also :, dann Befehl und Enter-Taste):

• :<Zahl> → Zu Zeilennummer springen

• :$ → Zur letzten Zeile

• :r <Dateiname> → Datei öffnen

• :e → Neue Datei anlegen

• :w → Speichern

• :q → Buffer schließen/Beenden, :q! → Beenden ohne zu speichern

• :wq → Speichern & Beenden

• :help bzw. :h → Hilfe in neuem „Fenster“/Buffer anzeigen (z.B. :h j Hilfe zum Befehl j) Man kann auch Ranges vor dem Befehl angeben, z.B.:

• % → Alle Zeilen

• . → Die aktuelle Zeile (ist Standard für die meisten Befehle)

• 1 → Die erste Zeile

• $ → Die letzte Zeile

• n,m → Die Zeilen n bis m (wobei auch . und $ verwendet werden kann)

Vim - Suchen und Ersetzen

Suchen und Ersetzen (siehe auch Vim Wikia: Search and replace):

• /<regex> → Vorwärts nach dem regulären Ausdruck suchen

• ?<regex> → Rückwärs nach dem regulären Ausdruck suchen

• n/N → Vorwärts/Rückwärts weitersuchen

• :s/muster/ersatz/[g|c] → Ersetzt den Text, auf den Muster (ein regulärer Ausdruck) passt, mit dem Ersatztext. „g“ steht für „auch mehrmals in der selben Zeile“, „c“ steht für Bestätigen.

(7)

Wie die meisten Befehle wird standardmäßig nur die aktuelle Zeile verwendet, daher Ranges verwenden!

Vim - Eingabemodus

Wechseln in den EingabeModus:

• i → Einfügen vor dem Cursor

• I → Einfügen am Zeilenanfang

• a → Einfügen nach dem Cursor

• A → Einfügen am Zeilenende

• r → Ein Zeichen ersetzen

• R → Überschreiben ab dem Cursor

• c → Ändern (z.B. c[i]w → Wort ändern, cc → Zeile ändern)

• o/O → Neue Zeile nach/vor aktueller Zeile einfügen

Zurück in den normalen Modus kommt man mit der Escape-Taste, man hält sich meist nur kurz im Eingabemodus auf.

Vim - Visueller Modus

Mit v (Zeichen markieren), V (Zeilen markieren) oder Strg-V (Block=Rechteck markieren) wird der visuelle Modus aktiviert:

• y → Bereich kopieren („yank“)

• d oder x → Bereich löschen/ausschneiden

• I/A → Text vor/nach Block einfügen Im normalen Modus:

• p/P → Kopierten/Ausgeschnitten Text nach/vor Cursor einfügen

nano vs vim vs Emacs

(8)

XKCD Comic 378

Copyright und Lizenz

• Copyright: Thomas Leitner thomas.leitner@univie.ac.at

• Basiert teilweise auf den Folien von Harald Schilly harald.schilly@univie.ac.at

• Lizenz: Creative Commons CC BY-NC-SA

„Namensnennung-Keine kommerzielle Nutzung-Weitergabe unter gleichen Bedingungen 3.0 Österreich.“ - http://creativecommons.org/licenses/by-nc-sa/3.0/at/

• Das XKCD-Comic zu „Real Programmers“ steht steht unter der CC BY-NC 2.5 Lizenz.

Referenzen

ÄHNLICHE DOKUMENTE

 Pointer (hier: ptr) kann Wert zugewiesen werden, Array-Namen (hier: intArray) nicht.. identisch.. durch Kopieren über void-Pointer

•  Mittels Pointer können Funktionen auch als Parameter an andere Funktionen übergeben werden.. Ausdrücke, Operatoren, Typwandlung

Können Sie die map Methode so umschreiben, dass diese nicht mehr nur auf Listen von Double, sondern allgemeinen Listen arbeitet. In [50]: //

kann man die von endlichen Automaten akzeptierbaren Sprachen auch anders (automatenfrei) beschreiben.. 3.  Wie vereinfacht (reduziert, minimiert) man endliche

Regular Grammars Generate..

Analog zu a) kann man die Äquivalenz der beiden verlangten Formeln zeigen. Zu 3.1.1: a) Wenn 3 gleiche Quadrate an jeder Ecke eines konvexen Körpers zusammenstoßen, geht man von

Für jeden regulären Ausdruck e kann (in linearer Zeit :-) ein -NFA konstruiert werden, der die Sprache [[ e ]]

Je nachdem, wie eine Variable mit anderen Parametern oder Konstanten in einer Aufgabenstellung verknüpft ist, entstehen unterschiedliche Ausdrücke, die in