Bash-regex: wie n mal mit 'grep' oder 'ls'
Ich würde gerne match n Ziffern der folgenden Art und Weise mit grep oder ls:
echo "ABCD150915.7z" | grep "ABCD[[:digit:]]{6}.7z"
Die oben nicht funktioniert, und ich habe versucht ganz viele Möglichkeiten, wie jetzt.. Wie kann das getan werden?
Ich verstehen, es gibt andere Möglichkeiten, aber bitte beachten Sie, dass ich möchte wissen, ob das konkret möglich ist: [[:digit:]] und {6} mit grep oder ls.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist möglich, mit einer der beiden Methoden:
Aktivieren Extended regular expression-Modus mit
-E
bedeutet, dass die geschweiften Klammern verstanden werden.Alternativ können Sie entkommen die geschweiften Klammern:
Wenn Sie möchten, um eine Liste aller übereinstimmenden Dateien der Muster, die Sie verwenden können, einen Klumpen expansion statt:
...und wenn Sie denken über die Schleife durch die Dateien, Sie sollten es so machen:
Ist es ratsam zu aktivieren
failglob
in beiden Fällen (Einsatzshopt -s failglob
), so dass, wenn keine Dateien, die dem Muster entsprechen, das Kommando /Schleife nicht ausgeführt.Den
[0-9]
in diesen Beispielen ist nicht unbedingt das gleiche wie[[:digit:]]
, also, wenn Sie erfordern eine strikte übereinstimmung mit nichts als einer Ziffer, dann sollten Sie das stattdessen benutzen.Klar zu sein, wenn Sie
ls ABCD[0-9][0-9][0-9][0-9][0-9][0-9].7z
die shell erweitert die glob in einer Liste von Argumenten vor übergabe anls
, sols
ist nicht wirklich viel anderes als echo auf diese Argumente. Dies kontrastiert mit den einzelnen zitierte argument übergebengrep
, die interpretiertgrep
als regulären Ausdruck. Glob Ausdrücke und reguläre Ausdrücke sind zwei verschiedene Dinge, so können Sie nicht erwarten, dass die syntax für Sie das gleiche zu sein.Müssen Sie entkommen, geschweifte Klammern, da grundlegende grep verwendet BRE (Basic Regular Expression), in dem
\{\}
wirkt wie ein repeatation Quantifizierer, wo unescaped{}
würde passen wörtliche{
,}
Klammern.Besser Ankern.
Brauchen Sie nicht
grep
für diese mitbash
:Die Antwort @Avinash Raj gab Sie korrekt ist. Aber es gibt einen anderen Weg zu.
Wenn Sie nicht wollen, zu entkommen die geschweiften Klammern(ich.e Ihre grep-Ausdruck ist viel länger und man kann sich in Ihnen verlieren) können Sie egrep:
egrep
ist das gleiche wiegrep -E
, außer, dass die erstere ist veraltet.