sed, awk und Perl regular expressions
Document Sample


sed, awk und Perl
10 Programmiersprachen in
einem Semester
Thomas Mangold
regular expressions
10 Programmiersprachen in
einem Semester
Thomas Mangold
1
UNIX-Werkzeuge
• Konfiguration in Textfiles
• mit wachsendem Umfang steigt der
Suchbedarf
• Intelligente Suche
UNIX-Werkzeuge
• Konfiguration in Textfiles
• mit wachsendem Umfang steigt der
Suchbedarf
• Intelligente Suche
regular expressions
2
regular expressions
Zeichen Bedeutung
. Findet jedes beliebige Zeichen ausser
dem Zeilenende
[ ], [^ ] Findet eines der in den Klammern
eingeschlossenen Zeichen resp. findet
alle ausser den in den Klammern
eingeschlosssen Zeichen
\( \) Gruppiert Teilausdrücke
^ Findet den Zeilenanfang
$ Findet das Zeilenende
regular expressions II
Zeichen Bedeutung
* Findet das vorgängige Metazeichen
beliebig oft (auch 0 mal).
\{n,m\} Findet das vorgängige Metazeichen
mindestens n und maximal m mal
\ Setzt das folgende Metazeichen ausser
Kraft.
3
extended regular expressions
Zeichen Bedeutung
+ Findet das vorgängige Metazeichen
mindestens einmal
? Findet das vorgängige Metazeichen nicht
oder einmal.
| Findet alternativ das Metazeichen links
oder rechts des Pipesymbols
{n,m} Geschweifte Klammern gültig ohne \
( ) Gruppiert einen Teilausdruck ohne \
\n Wiederholt den n-ten Teilausdruck
POSIX regular Expressions
[:alnum:] alle Buchstaben oder Zahlen
[:alpha:] alle Buchstaben (auch Sonderzeichen)
[cntrl:] alle Steuerzeichen
[:digit:] alle Ziffern
[:lower:] alle Kleinbuchstaben
[:print:] alle druckbaren Zeichen
[:punct:] alle Interpunktionen
[:space:] alle Leerzeichen
[:upper:] alle Grossbuchstaben
4
Perl regular Expressions
\d alle Ziffern
\D keine Ziffern
\s alle Leerzeichen
\S keine Leerzeichen
\w gültiger Bezeichner [a-zA-Z0-9_]
\W kein gültiger Bezeichner
[^a-zA-Z0-9_]
\0 Nullstring \0
\b Wortgrenze
\B keine Wortgrenze
sed
• Stream – Editor
• Arbeitet das Eingabefile sequentiell ab, so dass
auch Files bearbeitet werden könne, welche
nicht in den Hauptspeicher passen.
• Syntax in der Befehlssequenz wie beim Suchen
in vi.
• Aufruf mit den Optionen
–e ”Befehlssequenz" oder
mit –f <BefehlsFile>.
5
sed – Befehlssequenz
• Die allgemeine Syntax ist:[address]command
• Die Adresse ist eine Zeilennummer oder ein
(regulärer) Ausdruck dafür:
(ohne) alle Zeilen
n 5 die angegebene Zeile n
n,m 3,10 alle Zeilen von n bis m
n,m! 3,10! Alle Zeilen ausser von n bis m
/regex/ 1,/^$/ Alle Zeilen, welche zum
Ausdruck passen.
$ $ die letzte Zeile
sed – Befehlssequenz II
# Kommentar Nur auf der 1. Zeile
s Ersetzen [adr]s/<find>/<replace>/<flag>
dD Entfernen [adr]d oder [adr]D (multiline)
a Anhängen [zeile]a\
<append>
i Einfügen [zeile]i\
<insert>
c Ändern [adr]c\
<change>
y Transform. [adr]y/input/output/
6
sed – Befehlssequenz III
l Auflisten gibt auch Steuerzeichen aus.
p Ausgeben gibt die Zeile aus
= ZeilenNr gibt die Zeilennummer aus
nN nächste Znr ändert die Flusskontrolle
r Einlesen Liest ein File an die Adresse
w Schreiben Schreibt in ein File
hH speichern Zeile in den Zwischenspeicher
gG lesen Zeile aus dem Speicher
x tauschen Speicher und Eingabe tauschen
sed – Suchen / Ersetzen
Flag Bedeutung
(ohne) nur erstes Vorkommen wird ersetzt
g globales Ersetzen
\n nur n-tes Vorkommen ersetzen
p Zusätzliches Echo des Suchmusters
w <file> Ausgabe in ein File
Zeichen Wird ersetzt durch
\n n-te Gruppe des Suchmusters
& Suchmuster
\ Zeilenumbruch
7
sinnvoller Einsatz von sed
• kleine, wiederkehrende Transformationen
innerhalb der gleichen Zeile.
• Beispiele:
– Ersatz der Umlaute durch ihre Latex-Codes
– Transformation Zeilenenden zwischen den
verschiedenen Systemen.
– Filtern von einfachen Logfiles
awk
• Benannt nach den drei Erfindern A. Aho,
P. Weinberger und B. Kerninghan.
• Implizite Eingabeschleife über alle Zeilen.
• Regulärer Ausdruck bestimmt, ob eine
Zeile verarbeitet wird.
• Aktionen in geschweiften Klammern.
• C-Syntax innerhalb der Aktionen
8
awk – Feld- und Satztrenner
• Den Systemvariablen FS und RS können
beliebige (reguläre) Ausdrücke
zugewiesen werden.
FS = "\t" Jeder Tab trennt
FS = "\t+" Jede Tabfolge trennt
FS = "[ :\t]+" Jede Folge von \t, : und Space
RS = "\n\r" Zeilenende für Dosen
awk – Systemvariabeln
$n n-te Spalte
FILENAME aktuell bearbeitetes Eingabefile
FNR Numer des Eingabefiles
FS, OFS Eingabe, Ausgabe Feldtrenner
NF Anzahl Spalten der aktuellen Zeile
NR aktuell bearbeitete Eingabezeile
RS, ORS Eingabe, und Ausgabesatztrenner
9
awk – Datenstrukturen
• alle Variablen sind global sichtbar
• Arrays mit beliebigen Schlüsseln
wochentage["Mo"] = " Montag“
• Iteration über ein Array
for (tag in wochentage){
print wochentage[tag]
}
• asort(arr[,dest]) nimmt zwei Arrays, liefert
die Länge des Arrays und kopiert optional das
Array in ein neues Array
awk – Erweiterungen zu C
• Einige zusätzliche Schlüsselworte zur
Steuerung der Flusskontrolle mit den
Zeilen: next, exit und getline.
• Eine vereinfachte Ausgabefunktion print
• Einige komfortablere Stringbearbeitungs-
funktionen als sie string.h bietet:
– [g]sub(s, t), index(s, t), length(s)
– match(s, r), split(s, a, r)
10
sinnvoller Einsatz von awk
• kleine Transformationen mit Informationen,
welche zeilenübergreifend gespeichert werden
müssen.
• Wenn eine rasche Wegwerflösung gesucht ist.
• Beispiele:
– Ergänzen von Logeinträgen mit dem Datum und
Formatierung als SQL-Importstatements
– Transformation von Datenbankdumps im Textformat
für den Import in ein System eines anderen
Herstellers.
Perl
• Practical extraction and report language
• interpretiert und schwach typisiert
• Substantive und Verben
• Evolution, beinahe Religion
• TMTOWTDI („Tim Towdy“ –
There‘s more than one way to do it)
11
Perl – Aufrufoptionen
• Normaler Aufruf mit perl script.pl
• Mit shebang #! /usr/bin/perl
• Im Debugger perl –d script.pl
• Interaktiv perl –de 4711
Perl – Variabelnmarkierung
Typ Sym. Beispiel Bedeutung
Skalar $ $laenge Zahl oder String
Array @ @farben geordnete Liste
Hash % %farbcod Menge von Schlüs-
es sel/Wert-Paaren
Routine & &male aufrufbarer Code
Referenz \ \@farben Zeiger auf @farben
12
Perl – Fallstricke
• Variabeln und Escapesequenzen in Zei-
chenketten mit doppelten Hochkommata
werden ausgewertet, in einfachen
dagegen nicht:
print "$var\n“; # druckt den
# Inhalt von $var und
# eine Zeilenschaltung.
print '$var\n‘; # druckt $var\n
Perl – Array und Hash
• @wt = ("Mo" , "Di" , "Mi" , "Do" ,
"Fr" , "Sa" , "So" );
• %wochentage = ("Mo" , "Montag" ,
"Di" , "Dienstag" , "Mi" ,
"Mittwoch" , "Do" , "Donnerstag" ,
"Fr" , "Freitag" , "Sa" , "Samstag"
, "So" , "Sonntag" );
• Da diese Hasheingabe unlesbar ist, existiert das
Zuweisungszeichen =>
13
Perl – Array und Hash II
%wochentage = (
"Mo" => "Montag" ,
"Di" => "Dienstag" ,
"Mi" => "Mittwoch" ,
"Do" => "Donnerstag" ,
"Fr" => "Freitag" ,
"Sa" => "Samstag" ,
"So" => "Sonntag"
);
Perl – Array und Hash III
• Auf Array und Hash wird so zugegriffen:
print $wt[0]; # Druckt Mo
print $wochentag{"Mo"}; #druckt Montag
• Vorsicht bei unbenannten Arrays, eckige Klammer sind
ein Kopierkonstruktor:
$lok{"55728"}=["Re620","Re420"]
• weist dem Hashelement einen Zeiger auf ein
unbenanntes Array zu.
• Die Grösse eines Array wird mit $#arr abgefragt.
• Die Funktionen push und pop wirken auf den Schluss
eines Arrays, shift auf den Kopf
14
Perl – Array und Hash auslesen
• Zum bequemen Leeren eines Arrays existiert die
Funktion shift:
while (@myArray) {
print $myArray[0], "\t“;
shift @myArray;
}
• Itererieren über Array und Hash:
foreach $elem (@myArray) {
print $elem;
}
while (($k,v$) = each %myHash) {
print „key: $k,\tvalue: $v;
}
Perl – Packages und Module
• Gleichnamige Variabeln und Routinen aus
unterschiedlichen Paketen:
kamel::reiten();
pferd::reiten();
• Fremde Module einbinden:
use modul;
• Module sind Files wie modul.pm
• Dort sind die Pakete definiert
package package1;
15
Perl – Funktionen und Scope
• In Perl sind Prozeduren und Funktionen
das gleiche:
sub MyFunction {
my $local; # lokale Variable
@params = @_;
return $rc;
}
• Übergabe als Referenz möglich aber
Dereferenzierung in der Funktion.
• Parameter immer in der Variablen @_
Perl – Input/Output
• Backtick Operator
$host = "courses.cs.unibas.ch";
$info = `ping –a –c 1 $host`;
• Filehandles
open(<FH, "filename") # lesen
open(>FH, "filename") # schreiben
open(>>FH, "filename") # anhängen
• speziell:
while(<>){
print; } # druckt $_
16
Perl – Operatoren
• Pfeiloperator (Zeiger)
$ref->[5]; # Arrayelelement
$ref->{"BS"}; # Hasheintrag
$ref->(1,2,3);# Funktion
• Bindung
if(($k,$v)=$str =~ m/(\w+)=(\w*)/){
print "Key: $k\tValue: $v";
}
Perl – Operatorprobleme
• Funktionen ohne Klammern wie print und
delete wirken wie unäre Operatoren und
nehmen implizit als Argument die System-
variable $_.
print ($var & 255) + 1, "\n";
print (($var & 255) + 1, "\n“);
17
Perl – File Test Operatoren
-r,-w,-x,-o Berechtigungen, Besitzer (Script)
-R,-W,-X,-O Berechtigungen, Besitzer (User)
-e File existiert?
-z File hat die Grösse 0?
-s File ist grösser als 0, (return size)
-f,-d,-l,-p,-S normales File, Directory, symb. Link,
Pipe oder Socket?
-T Textfile?
Perl – Kontrollstrukturen
• Blöcke zwingend klammern
• Blöcke sind Schleifen
if (/muster/) {{ # /muster/ ∈ $_
last if /alpha/;
# tu sonst was
}}
do {{
next if $x eq $y;
# tu was bei $x != $y
}} until $x++ > $z;
18
Perl – Kontrollstrukturen II
• Blöcke zwingend klammern
• Blöcke sind Schleifen
if (/muster/) {{ # /muster/ ∈ $_
last if /alpha/;
# tu sonst was
}}
do {{
next if $x eq $y;
# tu was bei $x != $y
}} until $x++ > $z;
Perl – Kontrollstrukturen
• kein switch-case
• next, redo und last statt continue
und break
for (;;) {
next if $x == $y;
redo if /muster/;
last if $x > $y ** 2;
# default etwas tun
}
19
Perl – Systemvariablen
@ARGV Array mit den Argumenten (Skript)
@_ Array mit den Parametern (Funktion)
%ENV Hashtabelle mit den Umgebungsvar.
$! letzte aufgetretene Fehlernummer
_ letztes bearbeitets Filehandle
$n n-ter Treffer des regulären Ausdrucks
@+ Endpositionen der Treffer
@- Startpositionen der Treffer
$+ letzter getroffener Teilausdruck
Perl – Systemvariablen II
$& letzter Treffer
$` Teilstring vor dem Treffer
$' Teilstring nach dem Treffer
_ Handle des letzten Files
$. Nummer der eingelesenen Zeile
@F Spaltenwerte der aktuellen Zeile
$" Aktueller Feldtrenner
$/ Aktueller Zeilentrenner
20
Perl – Systemvariablen III
$$ Aktuelle Prozess-ID
$( Aktuelle Gruppen-ID
$< Aktuelle Benutzer-ID
$a Sortieren: linke Seite des Vergleichs
$b Sortieren: rechte Seite des Vergleichs
Perl – Mustervergleich
• Wichtigstes Merkmal von Perl
• zusätzliche Modifier und Metazeichen
• Drei grundsätzliche Aufrufe:
– match (m): [m?]/muster/cgimosx
– substitute (s): s/muster/ersatz/egimosx
– transliterate (tr): tr/s_liste/e_liste/cds
• Die Aufrufe füllen unter anderem die
Systemvariablen @+, @-, $+, $&, $`, $'
21
Perl – match RegEx
• Findet Wortwiederholungen
$/ = ""; # zeilenuebergreifend
while (<>) {
while(m/\b(\w\S+)(\s+\1)+\b/xig){
print "dup word '$1' at $.";
}
}
Perl – substitute RegEx
• Löscht Leerzeichen
for ($string) {
s/^\s+//; # entfernt führende
s/\s+$//; # entfernt am Schluss
s/\s+/ /g; # ersetzt mehrfache
}
• Implizite Bindung an $_
22
Perl – transliterate RegEx
• # transliteration
# Ersetzt die Nukleinsaueren
# durch ihr Komplement
# hier im Perl−Stil
while (<>){
tr/ATGC/TACG/ ;
print $_;
}
Perl – transliterate RegEx II
• Es geht auch anständig:
my $file = shift;
open(IN, "<$file") or die …
my $line;
while ($line = <IN>){
$line =~ tr/ATGC/TACG/ ;
print $line;
}
23
Perl – Fehlerbehandlung
• Fehlernummer als Rückgabewert
# Fehlernummer in $!
open(IN ">$file") or die \\
"Fehler … File $file" , \\
return $!;
• Warnung
x >= 0 or warn "Wert negative";
• Exception
# Exception ist in $@ enthalten
die if $@;
Links
• GNU-Tools für Windows:
http://unxutils.sourceforge.net/
• Manpages von sed und awk für Windows Benutzer
http://www.tu-berlin.de/zrz/dienste/www/manpages/sed.html
http://www.tu-berlin.de/zrz/dienste/www/manpages/awk.html
• Perl Bibliothek:
http://www.perl.com/CPAN/
http://search.cpan.org/
• Perl Dokumentation zum herunterladen:
http://perldoc.perl.org/perldoc.tar.gz
• Perl Cheatsheet:
http://perldoc.perl.org/perlcheat.html
24
Related docs
Get documents about "