Reguläre Ausdrücke in einer Shell

Reguläre Ausdrücke in einer Shell

Ich habe zwei Fragen zur Verwendung regulärer Ausdrücke innerhalb einer Shell.

1. Verwendung von *

EntsprechendWikipedia-Seite zu regulären Ausdrücken:

*: Das Sternchen gibt an, dass kein oder mehrere der vorhergehenden Elemente vorhanden sind. Beispielsweise entspricht ab*c „ac“, „abc“, „abbc“, „abbbc“ usw.

Wenn ich jedoch schreibe rm test*.iso, werden alle Dateien gelöscht, die mit "test" beginnen und mit ".iso" enden, egal, was zwischen "test" und ".iso" steht (oder nicht). Die Datei "tes.iso" wird alsonichtgelöscht.

Wenn Sie das abc-Beispiel nehmen, stimmt laut Wikipedia "ab*c" mit "ac" überein. Daher rm ab*csollte eine "ac"-Datei gelöscht werden.Warum verwendet rm keine regulären Ausdrücke, wie sie in Wikipedia beschrieben werden?

2. Verwendung von - und ?

Noch immer lautWikipedia-Seite zu regulären Ausdrücken:

?: Das Fragezeichen gibt an, dass kein oder eins der vorhergehenden Elemente vorhanden ist. Beispielsweise entspricht colou?r sowohl „color“ als auch „colour“.

+: Das Pluszeichen gibt an, dass ein oder mehrere der vorhergehenden Elemente vorhanden sind. Beispielsweise entspricht ab+c „abc“, „abbc“, „abbbc“ usw., aber nicht „ac“.

„?“ scheint wie „*“ zu funktionieren, d. h. das Symbol „?“ ersetzt ein oder kein Element (aber nicht das vorhergehende, anders als in Wikipedia angegeben).

Ich weiß nicht, wie man "+" verwendet, und das ist meine zweite Frage. Ich bin auch an allen Tricks bezüglich regulärer Ausdrücke und interessiert rm, cp, ....

Antwort1

Die SchaleMustervergleichsnotationwird beschrieben indieses Normendokument.

Wie in der Einleitung des Dokuments erwähnt, ist die Mustervergleichsnotation mit der regulären Ausdrucksnotation verwandt, unterscheidet sich jedoch geringfügig davon.

Insbesondere ?verhält sich in der Shell wie .in einem regulären Ausdruck und *in der Shell verhält sich wie .*in einem regulären Ausdruck. (Aber keiner von beiden wird mit a .am Anfang eines Dateinamens übereinstimmen.) +in der Shell hat keine spezielle Mustervergleichsfunktion. Wie @HaukeLaging jedoch in seiner Antwort sagt, kann bei bestimmten Shells optional die Notation für reguläre Ausdrücke aktiviert werden, obwohl dies nicht standardmäßig ist.

Antwort2

Die Shell verwendet reguläre Ausdrücke nur unter bestimmten Bedingungen (die wahrscheinlich von Shell zu Shell unterschiedlich sind).

In diesem Fall bashmüssen Sie diese aktivieren mit:shopt -s extglob

Danach können Sie etwas wie Folgendes verwenden:

echo a*(b)c

Siehe den Block Pattern Matchingin man bash.

verwandte Informationen