Regex auf Ausgabe von ls -l
Mustard
- sonstiges
0 steckl0 Mustard
0 Gunnar Bittersmann0 Gunnar Bittersmann0 seth
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
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
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
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
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
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
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
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
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