So prüfen Sie, ob ein String in Bash einen Teilstring enthält

How Check If String Contains Substring Bash



Die Frage ist, wie man in Bash prüft, ob ein String einen Teilstring enthält. Die Antwort lautet: Verwenden Sie Pattern Matching. Daraus ergibt sich eine weitere Frage: Was ist Pattern Matching? Nun, eine Phrase in einem Satz hat bestimmte Eigenschaften. Deshalb unterscheidet es sich von anderen Phrasen im selben Satz oder in anderen Sätzen. Die Merkmale können als Muster codiert werden. Auf diese Weise kann eine bestimmte Phrase in einer Zeichenfolge identifiziert werden. In diesem Artikel wird erläutert, wie Sie eine bestimmte Teilzeichenfolge in einer größeren Zeichenfolge identifizieren, die übereinstimmende Teilzeichenfolge durch eine andere Teilzeichenfolge ersetzen und jede Teilzeichenfolge in einer größeren Zeichenfolge nach Index suchen. Bevor man jedoch in die Erklärungen eintaucht, muss man sich an die verschiedenen Arten erinnern, wie ein String in Bash aufgebaut wird.

String durch Escaping Spaces

Ein String kann konstruiert werden, indem jedes Leerzeichen durch die Leerzeichen-Escape-Sequenz ‚‘ ersetzt wird; wie in:







myVar=Tourismusin Ägypten ist eines des Landes 's führende wirtschaftliche Branchen.
rauswerfen $myVar

Die Ausgabe ist:



Der Tourismus in Ägypten ist einer der führenden Wirtschaftszweige des Landes.



Hinweis: Der Apostroph verwendet auch die Leerzeichen-Escape-Sequenz.





String mit einfachen Anführungszeichen

Hat der Programmierer die Zeit, alle Leerzeichen in einer Zeichenfolge zu maskieren? Nein. Daher ist es besser, eine Zeichenfolge mit zwei einfachen Anführungszeichen zu begrenzen. wie zum Beispiel:

myVar=„Der Tourismus in Ägypten gehört zum Land“ ''s führenden Wirtschaftszweigen.'

Eine Zeichenfolge in einfachen Anführungszeichen erlaubt keine Erweiterung (Ersetzung mit ihrem Effekt) einer Escape-Sequenz. Wenn zwei Zeichenfolgen nebeneinander codiert sind, werden sie glücklicherweise als eine Zeichenfolge betrachtet. Eine Escape-Sequenz kann wie oben beschrieben dazwischen eingefügt werden. Die Escape-Sequenz würde erweitert werden. Die Ausgabe wird also:



Der Tourismus in Ägypten ist einer der führenden Wirtschaftszweige des Landes.

String mit doppelten Anführungszeichen

Bei doppelten Anführungszeichen werden Escape-Sequenzen nicht ebenfalls erweitert, aber Variablen werden erweitert. Der folgende Code veranschaulicht dies:

myVar=Tourismusin Ägypten ist eines des Landes 's führende wirtschaftliche Branchen.
rauswerfen $myVar

Die Ausgabe ist:

Der Tourismus in Ägypten ist einer der führenden Wirtschaftszweige des Landes.

Hinweis: Der Apostroph verwendet auch die Leerzeichen-Escape-Sequenz.

In diesem Artikel wird als Hauptzeichenfolgetyp die Zeichenfolge in einfachen Anführungszeichen betrachtet.

Grundlagen zu regulären Ausdrücken

Regex

Betrachten Sie diese Zeichenfolge:

Diese Welt ist nicht wirklich unser Zuhause.

Lassen Sie die Welt die interessierende Teilzeichenfolge sein. Dann wird die große Zeichenfolge (ganze Zeichenfolge) als Zielzeichenfolge oder einfach als Ziel bezeichnet. Die „Welt“ in Anführungszeichen wird als regulärer Ausdruck oder einfach als Regex bezeichnet. Der Inhalt, die Welt, ist in diesem Fall das Muster.

Einfache Zuordnung

Wenn im folgenden Code das Wort „Welt“ im Ziel gefunden wird, würden wir sagen, dass das Wort gefunden wurde.

P='Diese Welt ist nicht wirklich unser Zuhause.'
reg='Welt'
wenn [[ $ str= ~$reg ]];dann
rauswerfengefunden
anders
rauswerfennicht gefunden
Sein

=~ , der Zuweisungsoperator gefolgt von ~ , wird als Bindungsoperator bezeichnet. Die Bedingung prüft, ob das Muster in der Zielzeichenfolge übereinstimmt. Wenn im Ziel eine dem Muster entsprechende Teilzeichenfolge gefunden wird, zeigt die echo-Anweisung found an. Wenn es nicht gefunden wird, wird die echo-Anweisung nicht gefunden. Die Ausgabe für diesen Code ist:

gefunden

Als Muster findet sich die Welt im Ziel. Beachten Sie, dass das begrenzende Leerzeichen nach [[ und vor ]] beibehalten wurde.

Muster

Im obigen Code ist „Welt“ in Anführungszeichen die Regex, während Welt selbst das Muster ist. Dies ist ein einfaches Muster. Die meisten Muster sind jedoch nicht so einfach. Ein Muster ist eine Charakterisierung eines zu findenden Teilstrings. Daher verwendet das Bash-Muster bestimmte Metazeichen. Ein Metazeichen ist ein Zeichen über andere Zeichen. Bash Pattern verwendet beispielsweise die folgenden Metazeichen:

^ $ . * +? () [] {} |

In den Bedingungsdoppelklammern kann auch ein regulärer Ausdruck eingegeben werden. Aber es muss nicht in Anführungszeichen stehen. In diesem Fall handelt es sich also buchstäblich um ein Muster.

Charakterklassen

Eckige Klammern

Es wird die Ausgabe des folgenden Codes gefunden, was bedeutet, dass eine Übereinstimmung stattgefunden hat:

P='Die Katze kam in die Kammer.'
wenn [[ $ str= ~[cbr]bei]];dann
rauswerfengefunden
Sein

Das Muster [cbr]at hat eine Übereinstimmung mit cat, das mit „c“ beginnt und mit at fortfährt und endet. [cbr]at bedeutet „c“ oder „b“ oder „r“ gefolgt von at.

Es wird die Ausgabe des folgenden Codes gefunden, was bedeutet, dass eine Übereinstimmung stattgefunden hat:

P='Die Fledermaus ist in die Kammer gekommen.'
wenn [[ $ str= ~[cbr]bei]];dann
rauswerfengefunden
Sein

Das Muster [cbr]at hat passende Fledermaus, das mit „b“ beginnt und mit at fortfährt und endet. [cbr]at bedeutet „c“ oder „b“ oder „r“ gefolgt von at.

Es wird die Ausgabe des folgenden Codes gefunden, was bedeutet, dass eine Übereinstimmung stattgefunden hat:

P='Die Ratte ist in die Kammer gekommen.'
wenn [[ $ str= ~[cbr]bei]];dann
rauswerfengefunden
Sein

Das Muster [cbr]at hat mit Ratte gematcht, das mit 'r' beginnt und mit at fortfährt und endet.

In den obigen Codebeispielen weiß der Programmierer nicht, ob Katze oder Fledermaus oder Ratte in der Zielzeichenfolge vorhanden sind. Aber er weiß, dass die Teilzeichenfolge entweder mit „c“ oder „b“ oder „r“ beginnt, dann weitergeht und mit at endet. Eckige Klammern in einem Muster ermöglichen, dass verschiedene mögliche Zeichen einem Zeichen an einer Position relativ zu anderen im Ziel entsprechen. Eckige Klammern enthalten also eine Reihe von Zeichen, von denen eines für eine Teilzeichenfolge gefunden wird. Schließlich ist es die vollständige Teilzeichenfolge, die abgeglichen wird.

Zeichenbereich

Im obigen Code ist [cbr] eine Klasse. Auch wenn ‚c‘ oder ‚b‘ oder ‚r‘ einem einzelnen Zeichen entspricht, wenn das darauffolgende sofort nicht übereinstimmt, wird das Muster mit nichts übereinstimmen.

Nun, es gibt bestimmte Bereiche, die eine Klasse bilden. Zum Beispiel bilden 0 bis 9 Ziffern die Klasse, [0-9], wobei 0 und 9 eingeschlossen sind. Kleinbuchstaben ‚a‘ bis ‚z‘ bilden die Klasse [a-z] mit ‚a‘ und ‚z‘ eingeschlossen. Großbuchstaben ‚A‘ bis ‚Z‘ bilden die Klasse [A-Z] mit ‚A‘ und ‚Z‘ eingeschlossen. Von einer Klasse ist es eines der Zeichen, das einem Zeichen in der Zeichenfolge entsprechen würde.

Der folgende Code erzeugt eine Übereinstimmung:

wenn [[ 'ID8id'= ~[0-9] ]];dann
rauswerfengefunden
Sein

Diesmal ist das Ziel eine Literalzeichenfolge in der Bedingung. 8, die eine der möglichen Zahlen im Bereich [0-9] ist, hat in der Zeichenfolge „ID8id“ mit 8 übereinstimmt. Der obige Code entspricht:

wenn [[ 'ID8id'= ~[0123456789] ]];dann
rauswerfengefunden
Sein

Hier wurden alle möglichen Zahlen in das Muster geschrieben, es gibt also keinen Bindestrich.

Im folgenden Code wird eine Übereinstimmung erhalten:

wenn [[ 'ID8iD'= ~[a-z] ]];dann
rauswerfengefunden
Sein

Die Übereinstimmung besteht zwischen dem Kleinbuchstaben „i“ des Bereichs [a-z] und dem Kleinbuchstaben „i“ der Zielzeichenfolge „ID8iD“.

Denken Sie daran: Das Sortiment ist eine Klasse. Die Klasse kann Teil eines größeren Musters sein. In einem Muster kann der Text also vor und/oder nach der Klasse stehen. Der folgende Code veranschaulicht dies:

wenn [[ 'ID8id ist die Kennung'=~ ID[0-9]Ich würde ]];dann
rauswerfengefunden
Sein

Die Ausgabe lautet: gefunden. 'ID8id' aus dem Muster hat mit 'ID8id' in der Zielzeichenfolge übereinstimmt.

Negation

Die Übereinstimmung wird nicht aus dem folgenden Code erhalten:

wenn [[ '0123456789101112'= ~[^0-9] ]];dann
rauswerfengefunden
anders
rauswerfennicht gefunden
Sein

Die Ausgabe ist:

nicht gefunden

Ohne ^ vor dem Bereich innerhalb der eckigen Klammern würde die Null des Bereichs mit der ersten Null der Zielzeichenfolge übereinstimmen. Also negiert ^ vor einem Bereich (oder optionalen Zeichen) die Klasse.

Der folgende Code erzeugt eine Übereinstimmung, da die Bedingung lautet: match any non-digit character irgendwo in the target:

wenn [[ 'ABCDEFGHIJ'= ~[^0-9] ]];dann
rauswerfengefunden
anders
rauswerfennicht gefunden
Sein

Die Ausgabe lautet also: gefunden .

[^0-9] bedeutet eine Nichtziffer, also ist [^0-9] die Negation von [0-9] .

[^a-z] bedeutet kein Kleinbuchstabe, also ist [^a-z] die Negation von [a-z] .

[^A-Z] bedeutet kein Großbuchstabe, daher ist [^A-Z] die Negation von [A-Z] .

Andere Verneinungen sind verfügbar.

Der Punkt (.) im Muster

Der Punkt (.) im Muster entspricht jedem Zeichen, einschließlich sich selbst. Betrachten Sie den folgenden Code:

wenn [[ '6759WXY.A3'= ~ 7,9W.Y.A]];dann
rauswerfengefunden
Sein

Die Ausgabe des Codes wird gefunden, weil die anderen Zeichen übereinstimmen. Ein Punkt entspricht „5“; ein anderer Punkt entspricht 'X'; und der letzte Punkt entspricht einem Punkt.

Passende Alternative

Betrachten Sie diesen Satz für eine Zielzeichenfolge:

Der Käfig hat Vögel verschiedener Arten.

Jemand möchte vielleicht wissen, ob dieses Ziel eine Taube oder ein Pfau oder ein Adler hat. Der folgende Code kann verwendet werden:

P='Der Käfig hat Pfauen verschiedener Arten.'
wenn [[ $ str=~ Taube|Pfau|Adler]];dann
rauswerfengefunden
anders
rauswerfennicht gefunden
Sein

Die Ausgabe ist, gefunden. Das Wechselmetazeichen | war angestellt. Es kann zwei, drei, vier und mehr Alternativen geben. Was in diesem Code übereinstimmt, ist 'Pfau'.

Gruppierung

Im folgenden Muster wurden Klammern verwendet, um Zeichen zu gruppieren:

eine Bühne (Tänzer)

Die Gruppe hier ist ein Bühnentänzer, umgeben von den Metazeichen (und). (Tänzer) ist eine Untergruppe, während eine Bühne (Tänzer) die gesamte Gruppe ist. Folgendes berücksichtigen:

Die (Tänzerin ist großartig)

Hier ist die Untergruppe oder Teilzeichenfolge, Tänzerin ist großartig.

Teilstrings mit gemeinsamen Teilen

Ein Stakeholder ist eine Person, die ein Interesse an einem Unternehmen hat. Stellen Sie sich ein Unternehmen mit einer Website vor, Stake.com. Stellen Sie sich vor, dass sich einer der folgenden Zielzeichenfolgen im Computer befindet:

Die Website www.stake.com ist für das Geschäft bestimmt.;

Da ist der Stakeholder.;

Der Interessenvertreter arbeitet für Stake.com.;

Lassen Sie eine dieser Zeichenfolgen das Ziel sein. Der Programmierer möchte vielleicht wissen, ob sich Stake.com oder Stakeholder in einer beliebigen Zielzeichenfolge befinden. Sein Muster wäre:

stake.com|stakeholder

Abwechslung nutzen.

Einsatz wurde zweimal in die beiden Wörter getippt. Dies kann vermieden werden, indem Sie das Muster wie folgt eingeben:

Anteil(.com|Inhaber)

.com|holder ist in diesem Fall die Untergruppe.

Hinweis: die Verwendung des Wechselzeichens in diesem Fall. Stake.com oder Stakeholder werden weiterhin durchsucht. Die Ausgabe des folgenden Codes wird gefunden:

P='Die Website Stake.com ist für das Geschäft da.'
wenn [[ $ str=~ Einsatz(.mit|Halter) ]];dann
rauswerfengefunden
Sein

Die hier gefundene Teilzeichenfolge ist stack.com.

Das vordefinierte BASH_REMATCH-Array

BASH_REMATCH ist ein vordefiniertes Array. Angenommen, ein Muster hat Gruppen. Die gesamte übereinstimmende Gruppe geht in die Zelle für den Index 0 dieses Arrays. Die erste übereinstimmende Untergruppe geht in die Zelle für Index 1; die zweite übereinstimmende Untergruppe geht in die Zelle für Index 2 und so weiter. Der folgende Code zeigt, wie dieses Array verwendet wird:

P='Der Bühnentänzer ist gekommen.'
wenn [[ $ str=~ Bühne(Tänzer) ]];dann
rauswerfengefunden
Sein

zumichin ${!BASH_REMATCH[@]};tun
druckenf '${BASH_REMATCH[i]}, '
getan
rauswerfen

Die Ausgabe ist:

gefunden
Bühnentänzer, Tänzer,

Die ganze Gruppe ist Bühnentänzer. Es gibt nur eine Untergruppe, die Tänzer sind.

Hinweis: Das Leerzeichen im Muster wurde mit Escapezeichen versehen.

Groß-/Kleinschreibung-Unabhängigkeitsabgleich

Beim Abgleich muss, wie oben erläutert, die Groß-/Kleinschreibung beachtet werden. Der Abgleich kann unabhängig vom Fall erfolgen. Dies wird im folgenden Code veranschaulicht:

Geschäfte -Snocasematch

P='Wir mögen gute Musik.'
wenn [[ $ str=~ GutO]];dann
rauswerfengefunden
Sein

Geschäfte -unocasematch

Die Ausgabe lautet: gefunden. Das Muster ist, GoodOd. Die gefundene Teilzeichenfolge ist 'gut'. Beachten Sie, wie die Option nocasematch am Anfang des Codesegments aktiviert und am Ende des Codesegments deaktiviert wurde.

Länge einer Zeichenfolge

Die Syntax zum Abrufen der Länge einer Zeichenfolge lautet:

${#PARAMETER}

Beispiel:

P='Wir mögen gute Musik.'
rauswerfen $ {# str}

Die Ausgabe ist: 19.

String-Reduktion

Die Syntaxen für die Zeichenfolgenreduzierung sind:

${PARAMETER:OFFSET}
${PARAMETER:OFFSET:LÄNGE}

wobei die Zählung für OFFSET bei Null beginnt.

Das folgende Beispiel zeigt, wie Sie die ersten 11 Zeichen einer Zeichenfolge entfernen:

P='Ich tanze immer zu guter Musik.'
rauswerfen $ {str: 10}

Die Ausgabe ist:

zu guter Musik.

Die Zählung für LENGTH beginnt mit dem nächsten Zeichen. Der folgende Code zeigt, wie ein Teil innerhalb der Zeichenfolge zugelassen werden kann:

P='Ich tanze immer zu guter Musik.'
rauswerfen $ {str: 10: 6}

Die Ausgabe ist:

ance t

Die ersten 11 Zeichen wurden entfernt; die nächsten 6 Zeichen waren erlaubt und der Rest der Zeichen wurde automatisch entfernt.

Suchen und ersetzen

Wenn eine Teilzeichenfolge gefunden wird, kann sie durch eine andere Teilzeichenfolge ersetzt werden. Die Syntaxen dafür sind:

wo=${PARAMETER/MUSTER/ERSETZUNG}
wo=${PARAMETER//MUSTER/ERSETZUNG}
wo=${PARAMETER/MUSTER}
wo=${PARAMETER//MUSTER}

Bei der ersten Syntax mit einem einfachen Schrägstrich wird nur die erste Übereinstimmung ersetzt. Beispiel:

P='Es gibt eine Ratte, eine Fledermaus und eine Katze in der Kammer.'
rechts=${str/[cbr]at/große Kuh}
rauswerfen $ str
rauswerfen $ ret

Die Ausgabe ist:

In der Kammer sind eine Ratte, eine Fledermaus und eine Katze.
In der Kammer gibt es eine große Kuh, eine Fledermaus und eine Katze.

Bei der zweiten Syntax mit doppelten Schrägstrichen werden alle Vorkommen der Übereinstimmung ersetzt. Beispiel:

P='Es gibt eine Ratte, eine Fledermaus und eine Katze in der Kammer.'
rechts=${str//[cbr]at/große Kuh}
rauswerfen $ str
rauswerfen $ ret

Die Ausgabe ist:

In der Kammer sind eine Ratte, eine Fledermaus und eine Katze.
Es gibt eine große Kuh, eine große Kuh und eine große Kuh in der Kammer.

Für die dritte Syntax mit einem einzelnen Schrägstrich gibt es keinen Ersatz für die erste und einzige Übereinstimmung.

Außerdem wird die erste gefundene Teilzeichenfolge gelöscht. Beispiel:

P='Es gibt eine Ratte, eine Fledermaus und eine Katze in der Kammer.'
rechts=${str/[cbr]at}
rauswerfen $ str
rauswerfen $ ret

Für die vierte Syntax mit doppelten Schrägstrichen gibt es keinen Ersatz für alle Übereinstimmungen. Außerdem werden alle gefundenen Teilstrings gelöscht. Beispiel:

P='Es gibt eine Ratte, eine Fledermaus und eine Katze in der Kammer.'
rechts=${str//[cbr]at}
rauswerfen $ str
rauswerfen $ ret

Die Ausgabe ist:

In der Kammer sind eine Ratte, eine Fledermaus und eine Katze.
Es gibt ein , ein und ein , in der Kammer.

Abschluss

Um in der Bash zu überprüfen, ob ein String einen Teilstring hat, muss Pattern Matching verwendet werden. Pattern Matching findet nicht nur in der Bedingung doppelte Klammern statt, [[ . . . ]]. Es kann auch in Parameterexpansion mit seinem ${ erfolgen. . .}. Mit der Parametererweiterung ist es möglich, einen Teilstring durch Indizes zu erhalten.

Was in diesem Artikel vorgestellt wurde, sind die kritischsten Punkte beim Pattern Matching. Da sind mehr! Was der Leser jedoch als nächstes studieren sollte, ist die Dateinamenerweiterung.