sed, awk und Perl regular expressions

Document Sample
scope of work template
							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