y=$(expr "$str" : ".*$x" - length "$x")
kann mir bitte jemand diesen Code erklären. Ich bin neu im Scripting und habe etwas Erfahrung mit C++ und Python. Eigentlich war diese Frage Teil meines Kommentars zu einer meiner vorherigen Fragen, aber ich bekomme keine Antworten.
Antwort1
Der expr
Ausdruck "$str" : ".*$x"
ist eine Übereinstimmung mit einem regulären Ausdruck. Die allgemeine Form ist
expr STRING : REGEXP
wo REGEXP
ist einverankerter regulärer Ausdruck- „verankert“ bedeutet, dass es versucht, REGEX
ab dem ersten Zeichen von zuzuordnen STRING
. Um also $x
irgendwo darin eine Übereinstimmung zu finden, $str
benötigen Sie so etwas wie .*
das Aufsaugen aller Zeichen vom Anker bis zum Anfang von$x
Das Ergebnis ist die Länge des übereinstimmenden Musters - das alles einschließt, was mit übereinstimmt, .*
sowie alles, was mit übereinstimmt $x
. Also
expr "$str" : ".*$x" - length "$x"
Gibt den Startindex der Übereinstimmung von $x
in zurück $str
oder minus der Länge von $x
, wenn keine Übereinstimmung gefunden wird. Also zum Beispiel:
$ expr foobarbaz : ".*bar" - length bar
3
$ expr foobar : ".*baz" - length baz
-3
Beachten Sie, dass die Verwendung zwar möglicherweise expr
mit Zeichenfolgen erfolgt, jedoch tatsächlich $x
als regulärer Ausdruck (GNU Basic) interpretiert wird. Seien Sie also vorsichtig, wenn der Ausdruck etwas anderes als alphanumerische Zeichen enthält.