Mustard: Regex auf Ausgabe von ls -l

Hallo.

Ich habe hier eine überarbeitete Ausgabe von ls -l eines Ordners, in dem nur Bilder liegen.
"Überarbeitet" heißt, ich hab die Dateirechte, die Besitzer und Gruppe schon rausgenommen. Jeder Eintrag sieht momentan so aus:

115011    2007-04-19 18:01 andreas~0.JPG

Da möchte ich nun alles vor dem Dateinamen löschen. Dazu benutze ich einen Editor, der Regex unterstützt (in meinem Fall Bluefish).

Mein Vorgehen habe ich mir so gedacht: Ich ersetze alle Suchergebnisse meines Regex' mit "", also mit nichts.
Ich habe folgenden Regex probiert, der aber nicht passt:

/*2007-[01-12]-[01-31] [00-23]:[00-59] /

Ich weiß nicht mal, ob ich den Limiter / rechts und links brauche. Ohne ihn kommt ab und zu die Fehlermeldung "Nothing to repeat bei Offset 0". Wobei ich doch gar nichts wiederholen lasse...
Rein nach Augenmaß müsste der Regex doch eigentlich greifen. Warum nicht und wie lautet dann der korrigierte Regex?

Danke
Mustard

  1. Hi,

    Ich habe hier eine überarbeitete Ausgabe von ls -l eines Ordners, in dem nur Bilder liegen.

    Da möchte ich nun alles vor dem Dateinamen löschen.

    Gibt es einen Grund, warum du nicht "ls" ohne das "-l" benutzt?

    mfG,
    steckl

    1. Hallo

      Gibt es einen Grund, warum du nicht "ls" ohne das "-l" benutzt?

      Das Problem ist, dass ich keinen Einfluss darauf hatte, ob und welcher Parameter benutzt wurde. Ich habe nur die Ausgabe von ls -l bekommen. Und damit muss ich nun zurecht kommen.

      Es handelt sich um 255 Zeilen, sprich auch 255 Bilder. Alles einzeln manuell zu löschen wäre ein Aufwand von einem Wochenende. Mit Regex aber nur von wenigen Sekunden.

      MfG
      Mustard

  2. Hello out there!

    Ich habe folgenden Regex probiert, der aber nicht passt:

    /*2007-[01-12]-[01-31] [00-23]:[00-59] /

    Was soll der '*'? Der ist nicht der Joker bei regulären Ausdrücken, sondern '.'.

    Du kannst nur Zeichenbereiche angeben; keine Zahlenbereiche. Also '2007-' gefolgt von zwei Ziffern gefolgt von '-' gefolgt von zwei Ziffern ...

    .*2007-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}

    (Für '[0-9]' kannst du auch '\d' schreiben, wenn dein Editor diese Syntax versteht.)

    Eine genauere Prüfung, welche Ziffern dort stehen, ist gar nicht notwendig, du willst ja das Datum nicht auf Gültigkeit prüfen. (Ginge auch, wäre aber unsinnig. [http://forum.de.selfhtml.org/archiv/2006/3/t126272/#m814810 ff.])

    Aber wozu hier ein regulärer Ausdruck? Die Anzahl der zu löschenden Zeichen sollte doch konstant und bekannt sein.

    Und natürlich, was [steckl] sagte.

    See ya up the road,
    Gunnar

    --
    „Wer Gründe anhört, kommt in Gefahr nachzugeben.“ (Goethe)
    1. Vielen Dank, jetzt hab ichs. Dieser Regex war richtig (naja, ein bisschen modifizieren musste ich ihn schon:

      [0-9]{5,6}    2007-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}

      )

      Danke
      Mustard

      1. gudn tach!

        [0-9]{5,6}    2007-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}

        statt [0-9] kann man oft auch \d verwenden (ist geschmackssache, aber auf jeden fall kuerzer).
        da die anzahl der leerzeichen und die groesse variieren kann, wuerde ich jene flexibler halten:

        \d+ +200\d-\d{2}-\d{2} \d{2}:\d{2}

        und statt eines gewoehnlichen editors kannst du auch gleich im cli sed oder perl verwenden, also z.b.

        perl -p -e "s/^\d+ +200\d-\d{2}-\d{2} \d{2}:\d{2} //" dateiname

        oder noch kuerzer:

        perl -p -e "s/^\d+ +200\d-\d\d-\d\d \d\d:\d\d //" dateiname

        in sed waere es dann wieder mit [0-9] statt \d und die braces muessten mit back-slash maskiert werden

        sed -e "s/[1]+ +200[0-9]-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2} //" dateiname

        oder

        sed -e "s/[2]+ +200[0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9] //" dateiname

        auf diese weise wird der ersetzte kram an STDOUT uebergeben. also kann er in eine datei gepipet werden, z.b.

        perl -p -e "s/^\d+ +200\d-\d\d-\d\d \d\d:\d\d //" dateiname > ersetzt.txt

        und mittels des parameters -i (in perl und in sed) kann man eine in-place-ersetzung durchfuehren, d.h. es wird der kram innerhalb der datei ersetzt.

        der vollstaendigkeit halber sei noch erwaehnt, dass "ls -1" (in worten: "eins" nicht die kleine version des buchstabens "L") gleich die gewuenschte ausgabe gebracht haette.

        prost
        seth


        1. 0-9 ↩︎

        2. 0-9 ↩︎

        1. gudn tach!

          sorry, hab was vergessen:

          in sed waere es dann wieder mit [0-9] statt \d und die braces muessten mit back-slash maskiert werden

          sed -e "s/[1]+ +200[0-9]-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2} //" dateiname

          und ausserdem muessen noch die plus-zeichen maskiert werden.

          sed -e "s/[2]+ +200[0-9]-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2} //" dateiname

          prost
          seth


          1. 0-9 ↩︎

          2. 0-9 ↩︎

  3. Hello out there!

    Dazu benutze ich einen Editor, der Regex unterstützt (in meinem Fall Bluefish).

    Benutzt dieser Editor auch blockweises Markieren? (Textpad tut das.)

    See ya up the road,
    Gunnar

    --
    „Wer Gründe anhört, kommt in Gefahr nachzugeben.“ (Goethe)
    1. gudn tach!

      Dazu benutze ich einen Editor, der Regex unterstützt (in meinem Fall Bluefish).

      Benutzt dieser Editor auch blockweises Markieren? (Textpad tut das.)

      vim kann beides.

      also entweder
        vim file<enter>
        <ctrl-v>G3Whd:w<enter>
      oder
        vim file<enter>
        :%s/^\d+ +200\d-\d\d-\d\d \d\d:\d\d //<enter>
        :w<enter>

      prost
      seth