ubuntuusers.de

"NICHT" in regular expression

Status: Gelöst | Ubuntu-Version: Ubuntu 10.10 (Maverick Meerkat)
Antworten |

rodgerwilco

Anmeldungsdatum:
23. März 2006

Beiträge: 490

Wohnort: Hannover

Hallo zusammen,

ich brech mir hier gerade ziemlich die Finger und frage mich mittlerweile, ob das was ich vorhabe überhaupt mit regular expression ausgedrückt werden kann. ich habe meine mp3-Sammlung überarbeitet und hoffentlich alle Dateien nach dem Muster <artist> - <track> - <title> umbenannt. Um zu überprüfen, ob auch wirklich alle Dateien erwischt wurden, würde ich gerne mittels "find" und regular expression die Dateien rausfinden, welche nicht in dieses Schema passen. Ist dies möglich und hat da einer eine Idee, wie das funktioniert? Im Grunde das folgende nicht ganz funktionierende Statement umkehren.

* - [0-9]{1,2} - *.[mM][pP]3

Greetz rodgerwilco

John_W

Anmeldungsdatum:
10. Juli 2010

Beiträge: 571

find ! -iname '* - [0-9]{1,2} - *\.mp3'

Wie das mit "echtem" regex geht, kapier ich aber auch nicht. Angeblich soll das z.B. so laufen:

*[^(auschließendes Kriterium)]

riffraff

Avatar von riffraff

Anmeldungsdatum:
1. Oktober 2006

Beiträge: 486

Wohnort: Im kühlen Norden

Wie hast Du denn die Tracknummern aufgebaut?

Wenn Du z.b. tracks von 0-99 hast, würde das:

find .  -name "* - [0-9][0-9] - *.[mP][pP]3"

diese finden und entsprechend ein

find . ! -name "* - [0-9][0-9] - *.[mP][pP]3"

genau diese NICHT anzeigen

Musikstücke die so benenannt worden sind z.B.:

madonna - 01 - like a virgin.mp3

robbie williams - 03 - hero.mp3

John_W

Anmeldungsdatum:
10. Juli 2010

Beiträge: 571

Nochmal ausgebessert:

find -iname '*.mp3' ! -iname '* - [0-9] - *\.mp3' ! -iname '* - [0-9][0-9] - *\.mp3'

riffraff, dein Befehl gibt Dateinamen wie "Test - 1 - test.mp3" aus... Mein erster Befehl allerdings auch, muss ich gestehen.

Jean_Baptiste_le_Rond

Anmeldungsdatum:
26. Oktober 2008

Beiträge: 355

Es geht auch so:

find | egrep -vi '.+ - [0-9]{1,2} - .+\.mp3'

John_W

Anmeldungsdatum:
10. Juli 2010

Beiträge: 571

# touch "Test - 1 - test.mp3.test"
# find | egrep -i '[a-z]+ - [0-9]{1,2} - .+\.mp3'
./Test - 1 - test.mp3.test

Ups... (Hinweis: Ich habe das Kriterium nicht negiert wie gewünscht war!)
Wenn man schon grep nehmen will (was ich in Verbindung mit find normalerweise nicht empfehle; hier ist das zu einfach, als dafür zwei Tools zu verwenden, finde ich), dann doch bitte "richtig":

find | grep -Evi '^[a-z]+ - [0-9]{1,2} - .+\.mp3$'

dAnjou

Avatar von dAnjou

Anmeldungsdatum:
8. Oktober 2007

Beiträge: 872

Wohnort: Berlin

Kurz und knapp: du kannst einen ganzen Ausdruck nicht negieren. Du musst dazu die Optionen der Werkzeuge wie
grep

 -v, --invert-match    Invert the sense of matching, to select non-matching lines. (-v  is specified by POSIX.)

oder find

 ! expr       True if expr is false. This character will also usually need protection from interpretation by the shell.

 -not expr    Same as ! expr, but not POSIX compliant.

benutzen.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi rodgerwilco,

im Grunde willst Du ja das Suchkriterium von find umkehren, und nicht den Regulären Ausdruck an sich.
Wie das geht haben die anderen hier ja auch schon bestens erläutert.

Ok, im Prinzip könntest Du auch einen Regulären Ausdruck bauen, der auf jedes erdenkliche Gegenteil matcht. Aber das wird doch ein fürchterlicher Krampf, weil Du ihn im Grunde ja komplett neu aufbauen musst, für alles, was als Gegenteil in Frage käme.

Das Stichwort: "[^(auschließendes Kriterium)]" von John W oben invertiert nur eine "[Liste_von_Zeichen]", gilt also immer nur für ein Zeichen und nicht einen kompletten Regulären Ausdruck - hilft hier also auch nicht weiter. (siehe z.B. bei sed oder bei awk )

LG,

track

rodgerwilco

(Themenstarter)

Anmeldungsdatum:
23. März 2006

Beiträge: 490

Wohnort: Hannover

Vielen Dank frü die ganzen Infos. Hab eine Menge über RegEx gelernt und konnte dann das Problem lösen und die verbliebenen Dateien umbenennen.

Greetz rodgerwilco

Antworten |