Warum funktioniert der folgende reguläre Ausdruck „Finden“ unter Linux nicht?

Warum funktioniert der folgende reguläre Ausdruck „Finden“ unter Linux nicht?

Ich versuche, Dateien zu finden, die einem bestimmten Muster entsprechen. Der Versuch, den folgenden Befehl auszuführen, liefert jedoch keine Ergebnisse, obwohl es Dateien gibt, die dem Muster entsprechen sollten.

find . -maxdepth 1 -regextype posix-extended -regex ".*/s_[a-zA-Z]_[a-zA-Z]\.png" -exec echo {} \;

Ich weiß, dass dies mit .*/dem gesamten Pfad übereinstimmen muss, verstehe aber nicht ganz, was das genau bedeutet.

Zu den Dateien, die übereinstimmen müssen, gehören beispielsweise

  1. s_wählen_blau.png
  2. s_wählen_rot.png
  3. s_neues_blau.png

Antwort1

Das eigentliche Problem mit Ihrem regulären Ausdruck ist, dass er nicht mit dem übereinstimmt, was er übereinstimmen soll. Um es aufzuschlüsseln:

  • .*/– ein beliebiges Zeichen, mehrfach, gefolgt von einem Schrägstrich. Dadurch wird grundsätzlich die Verzeichnisliste vor dem eigentlichen Dateinamen verbraucht, sodass es buchstäblich übereinstimmt ./(wie in Ihrem Beispiel), aber auch ./some/other/dir/bis zum letzten Schrägstrich.

    Dies funktioniert, weil reguläre Ausdrücke standardmäßig „gierig“ sind, was bedeutet, dass sie so viele Treffer wie möglich erzielen. Im Wesentlichen ermöglicht Ihnen dieser Teil, nur nach dem tatsächlichen Dateinamen zu suchen und den Pfad aus dem Ergebnis zu entfernen.

    Zusammenfassend lässt sich sagen, dass Sie .*/vor dem regulären Ausdruck das benötigen, wenn Sie nur den tatsächlichen Dateinamen benötigen. Wenn Sie auch einige Teile des Pfads mit der Datei abgleichen müssen, können Sie nicht verwenden.*/

  • s_– das funktioniert in Ihrem Beispiel einwandfrei

  • [a-zA-Z]– das verbraucht nureinsCharakter aus dieser Klasse

  • _– gefolgt von einem Unterstrich

  • [a-zA-Z]– wiederum gefolgt voneinsCharakter

  • \.png– wörtlich den Punkt und die Erweiterung abgleichen

Sie müssen Ihren regulären Ausdruck also wie folgt ändern:

.*/s_[a-zA-Z]+_[a-zA-Z]+\.png

Sie müssen das verwenden +, was im Wesentlichen „eins oder ein Vielfaches des vorherigen“ bedeutet.

verwandte Informationen