Hilfe zu regulären Ausdrücken

Von: , Frage gestellt am Mi, 16. Okt 2002

Hi,
für eine Übungsaufgabe soll die Ausgabe von ls -l in html-code umgewandelt werden und dabei nur bestimmte informationen angezeigt werden (user-rechte, besitzer, filegrösse, file-name).

ich bin mittels folgenden RE soweit, wie oben beschrieben, gekommen:

s/\(^[^ ]\+\) *[[:digit:]]* \([^ ]\+\) [^ ]\+ *\([[:digit:]]\+\) .* \([^ ]\+\)$/
<tr><td>\1<\/td><td>\2<\/td><td>\3<\/td><td><i><a href=\"\4\">\4<\/a><\/i><\/td>
<\/tr>/


jetzt zeigt er schon in einer html-tabelle:
drwxr--r-- chris 1892 index.html 

d.h. alle anderen infos wurden ausgeschlossen.

nun sollen jedoch die rechte-infos durch kleine images abgebildet werden, also blauer button für r, etc. meine frage lautet nun, wie kann ich diesen RE schachteln, so dass ich die userrechte (in Var \1) nochmal durch einen RE schicke, etwa so:

s/r/<img ...>/
s/w/<img ...>/
s/x/<img ...>/


oder geht das ganz anders? danke für eure hilfe!

gruss
christian

3 Antworten zu dieser Frage

  1. Antwort von nach einer Stunde 0 hilfreich
    Re: Hilfe zu regulären Ausdrücken

    Hi Christian,

    warum denn alles so kompliziert machen? Die eleganteste Lösung ist nicht immer die, die 23.000 Funktionen und Seiteneffekte in möglichst nur eine Zeile verpackt, sondern diejenige, die funktioniert und die man nach ein paar Stunden/Tagen/Wochen immer noch verstehen und ggf. warten kann. Also: Mut zum Mehrzeiler!

    In etwa so (sinngemäß, natürlich nicht in der Form lauffähig):

    ($rechte, $links, $user, $group, ...) =
    ($ls_line =~
    m/\(^[^ ]\+\) *[[:digit:]]* \([^ ]\+\) [^ ]\+ *\([[:digit:]]\+\) .* \([^ ]\+\)$/
    );


    # jetzt den 'Rechte'-String separat bearbeiten
    # ...

    # anschliessend ausgeben
    ...


    Gruß
    Bernhard

    • Antwort von nach einer Stunde 0 hilfreich
      Re^2: Hilfe zu regulären Ausdrücken

      Hi Bernhard,

      danke für die Antwort. Leider hab ich mich unpräzise ausgedrückt. Mir gings nicht darum, alles in eine Zeile zu packen. Dummerweise soll diese Aufgabe nicht mit Perl, sondern mit dem sed (stream-editor) gelöst werden.

      Habs ausprobiert, aber er akzeptiert nichts dergleichen, man muß alles in diesen Ausdruck packen, sonst kennt er die Var \1 nicht mehr.

      Das ganze skript sieht bis jetzt so aus:

      #!/usr/bin/sed -f
      # erzeugt html file aus dem aufruf ls -l
      # html-header vorweg
      1i\
      <html>\
      <body>\
      <table border=2>
      # 1. zeile (total 29) verwerfen
      1d
      # drwxr-xr-x   2 chris group     1389 Oct 16 09:13 index.html
      # RE: \1:=userrechte  \2:=user   \3:=size   \4:=filename 
      s/\(^[^ ]\+\) *[[:digit:]]* \([^ ]\+\) [^ ]\+ *\([[:digit:]]\+\) .* \([^ ]\+\)$/
      <tr><td>\1<\/td><td>\2<\/td><td>\3<\/td><td><i><a href=\"\4\">\4<\/a><\/i><\/td><\
      /tr>/
      # abschließend html
      $a\
      <\/table>\
      <\/body>\
      <\/html>
      

      Idee?

      Gruss
      Christian [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

      • Antwort von nach 21 Stunden 0 hilfreich
        Re^3: Hilfe zu regulären Ausdrücken

        Hallo nochmal,

        auch sed kennt die Möglichkeit, mehrere Aktionen hintereinander in Blöcken auszuführen...

        Ich würde es dann etwa so machen:

        #!/usr/bin/sed -nf
        # -n : keine automatische Ausgabe der Zeilen

        # Zeile 1 - Inhalt durch html-Header ersetzen
        1 {
        s/.*/<html><body><table border=2>/
        p
        }

        # Rest - als Tabelle umformatieren
        # drwxr-xr-x 2 chris group 1389 Oct 16 09:13 index.html
        # RE: \1:=userrechte \2:=user \3:=size \4:=filename

        2,$ {
        # erste Ersetzung - Tabellengrobaufbau (Zeile) ...
        s/\(^[^ ]\+\) *[[:digit:]]* \([^ ]\+\) [^ ]\+ *\([[:digit:]] +\) .* \([^ ]\+\)$/<tr><td>\1<\/td><td>\2<\/td><td>\3<\/td><td><i><a href=\"\4\">\4<\/a><\/i><\/td></tr>/

        # zweite Ersetzung: Spalte 1 (und nur diese mit Bildern ...)
        # umformatieren

        s/^<tr><td>d/<tr><td>/ .... (html: Bild fuer directory) .../
        # weitere Ersetzungen ...
        ...

        #und ausgeben
        p }

        $ {
        # abschließend html
        s/.*/<\/table><\/body>:<\/html>/
        p
        }

        Sorry fuer die bescheidene Formatierung
        Gruß
        Bernhard

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!