2013-03-11 9 views
27

Ich versuche, ER (Erweiterte Reguläre Ausdrücke) mit ls wie ls .+\..+ zu verwenden.Regulärer Ausdruck Verwendung mit ls

Ich versuche, alle Dateien zu drucken, die eine Erweiterung enthält (ich weiß, dass ich ls *.* hätte verwenden können, aber ich wollte versuchen, ER).

Wenn ich diesen Code ausführen, erhalte ich diesen Fehler: ls: .+..+: No such file or directory.

+5

Ich glaube, Sie verwirrend REs und Shell-Platzhalter sind. Die Antwort hängt auch davon ab, was sie benutzen wird. – Madbreaks

+1

Also kann ich nicht RE in ls verwenden? –

+2

Sofern Sie nicht einige ausgefallene, nicht-Standard-Skript für ls verwenden, nimmt ls nicht Regex. Außerdem verarbeitet das Betriebssystem spezielle Platzhalterzeichen wie *, bevor es an Ihren Befehl übergeben wird. Verwenden Sie stattdessen "Find" – GetSet

Antwort

57

Sie verwechseln regulären Ausdruck mit shell globbing. Wenn Sie reguläre Ausdrücke verwenden möchten Dateinamen übereinstimmen könnten Sie tun:

$ ls | egrep '.+\..+' 
+1

Verstanden. Also, zuerst muss ich überprüfen, ob das, was ich versuche zu verwenden, RE akzeptiert. –

+2

Wenn das Muster nicht mit 'globbing' allein verglichen werden kann, müssen Sie eine alternative Methode verwenden. * F.Y.I * Das Werkzeug 'find' unterstützt das Regexp-Matching. –

3

Sie sagen nicht, was Shell Sie verwenden, aber sie in der Regel nicht unterstützen reguläre Ausdrücke, die Art und Weise, obwohl es üblich sind * nix CLI-Tools (grep, sed, usw.), die tun.

Was Shells wie Bash unterstützen, ist globbing, die einige ähnliche Zeichen (zB *) verwendet, aber ist nicht das Gleiche.

Neuere Versionen von bash tun einen regulären Ausdruck Operator haben, =~:

for x in `ls`; do 
    if [[ $x =~ .+\..* ]]; then 
     echo $x; 
    fi; 
done 
+1

Cool! Ich habe noch nie davon gehört! :) Es ist also nur '= ~' und der Interpreter wird verstehen, dass das, was ich versuche, ein RE ist? –

+3

Sie müssen es im Zusammenhang mit einem * Test * verwenden, glaube ich mit doppelten Klammern, so dass für diesen speziellen Fall Piping durch (e) Grep ist viel einfacher. Aber es ist nützlich, darüber zu wissen. – delicateLatticeworkFever

+1

Vielen Dank für Ihre Hilfe! Ich werde mich an diesen Tipp erinnern! ;) –