Wie überprüft man, ob ein String in Bash einen Teilstring enthält?
Ich habe einen string in der Bash:
string="My string"
Wie kann ich testen, ob es einen anderen string enthält?
if [ $string ?? 'foo' ]; then
echo "It's there!"
fi
Wo ??
ist mein unbekannten Betreiber. Nutze ich echo und grep
?
if echo "$string" | grep 'foo'; then
echo "It's there!"
fi
Sieht das ein bisschen unbeholfen.
InformationsquelleAutor der Frage davidsheldon | 2008-10-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie Marcus ' Antwort (*- wildcards) außerhalb einer case-Anweisung, auch wenn Sie von doppelten Klammern:
Beachten Sie, dass Leerzeichen in der Nadel-string gesetzt werden müssen zwischen doppelten Anführungszeichen, und das
*
wildcards sollten draußen sein.InformationsquelleAutor der Antwort Adam Bellaire
Wenn Sie lieber die regex-Ansatz:
InformationsquelleAutor der Antwort Matt Tardiff
Ich bin mir nicht sicher über die Verwendung einer if-Anweisung, aber Sie können einen ähnlichen Effekt mit einer case-Anweisung:
InformationsquelleAutor der Antwort Marcus Griep
Kompatibel beantworten
Da gibt es schon eine Menge Antworten mit Bash-spezifische Funktionen, es ist ein Weg, arbeiten unter schlechteren Funktionsumfang Muscheln, wie busybox:
In der Praxis geben könnte:
Getestet wurde dies unter bashBindestrichksh und ash (busybox), und das Ergebnis ist immer:
In einer Funktion
Als gefragt von @EeroAaltonen hier ist eine version der gleichen demo, getestet unter den gleichen Schalen:
Dann:
Hinweis: Sie haben zu entkommen oder doppelte Anführungszeichen einschließen und/oder doppelten Anführungszeichen:
Einfache Funktion
Getestet wurde dies unter busyboxBindestrich und natürlich bash:
That ' s all folks!
Dann jetzt:
... Oder wenn die eingereichten string kann leer sein, wie bereits von @Sjlver, die Funktion würde:
oder wie vorgeschlagen von Adrian Günter Kommentardie Vermeidung
-o
switche:Mit leeren Saiten:
InformationsquelleAutor der Antwort F. Hauri
Sollten Sie daran denken, die shell-scripting ist weniger eine Sprache und mehr eine Sammlung von Befehlen. Instinktiv, Sie denken, dass diese "Sprache" erfordert, dass Sie die Folgen einer
if
mit einem[
oder eine[[
. Diese beiden sind nur Befehle, die einen exit-status, der Erfolg oder Misserfolg (so wie jeden anderen Befehl). Aus diesem Grund verwende ichgrep
und nicht die[
Befehl.Nur:
Nun, dass Sie denken
if
Test der exit-status des Befehls folgt, dass es (komplett mit semi-colon). Warum nicht überprüfen, die Quelle der Zeichenfolge, die Sie testen?Den
-q
option macht grep-Ausgabe nicht alles, wir wollen nur den return-code.<<<
macht die shell erweitern Sie das nächste Wort und verwenden Sie es als Eingabe für den Befehl, eine Online-version des<<
hier-Dokument (ich bin mir nicht sicher, ob dies ist standard-oder eine bashism).InformationsquelleAutor der Antwort Mark Baker
Die akzeptierte Antwort ist am besten, aber da gibt es mehr als einen Weg, es zu tun, hier ist eine andere Lösung:
${var/search/replace}
ist$var
mit der ersten Instanz vonsearch
ersetzt durchreplace
wenn es gefunden wird (es ändert sich nicht$var
). Wenn Sie versuchen, zu ersetzenfoo
von nichts, und der string geändert hat, dann offensichtlichfoo
gefunden wurde.InformationsquelleAutor der Antwort ephemient
So gibt es viele nützliche Lösungen für die Frage - aber was ist am schnellsten /benötigt am wenigsten Ressourcen?
Wiederholte tests mit diesem Rahmen:
Ersetzen jedes mal TESTEN:
(doContain war in F. Houri ' s Antwort)
Und kichert:
Also die einfache Aliase mit eingefügt werden sollen option predicatbly gewinnt, ob in einer erweiterten test oder eine Falle. Der Fall tragbar ist.
Rohrleitungen aus bis zu 100000 greps ist vorhersehbar schmerzhaft! Die alte Regel über die Verwendung von externen utilities ohne die Notwendigkeit für wahr hält.
InformationsquelleAutor der Antwort Paul Hedderly
Funktioniert das auch:
Und der negative test ist:
Ich nehme an, dieser Stil ist ein bisschen mehr classic -- weniger abhängig von den features der Bash-shell.
Den
--
argument ist Reine POSIX-paranoia, verwendet, um Schutz gegen Eingabe-strings, ähnlich wie Optionen, wie--abc
oder-a
.Hinweis: In einer engen Schleife mit diesem code wird viel langsamer als mit der internen Bash-shell-Funktionen, wie eine (oder zwei) separate Prozesse erzeugt und verbunden durch Rohre.
InformationsquelleAutor der Antwort kevinarpe
Wie wäre es damit:
InformationsquelleAutor der Antwort
Dieser Stack Overflow Antwort war der einzige, der trap-Raum und Strich chars:
InformationsquelleAutor der Antwort Yordan Georgiev
Als Paulus erwähnte in seiner performance-Vergleich:
Dies ist POSIX-konform wie der " Fall "$string"' Antwort von Marcus, aber etwas leichter zu Lesen als die case-Anweisung Antwort. Beachten Sie auch, dass dies viel, viel langsamer als die Verwendung einer case-Anweisung, wie Paulus wies darauf hin, verwenden Sie es nicht in einer Schleife.
InformationsquelleAutor der Antwort Samuel
InformationsquelleAutor der Antwort Jahid
Ist:
InformationsquelleAutor der Antwort chemila
grep -q
ist für diesen Zweck nützlich.Dasselbe mit
awk
:Ausgabe:
Ausgabe:
Original-Quelle: http://unstableme.blogspot.com/2008/06/bash-search-letter-in-string-awk.html
InformationsquelleAutor der Antwort
Ich wie sed.
Bearbeiten, Logik:
Sed benutzen, entfernen Sie die Instanz von substring aus string
Wenn neue Zeichenfolge unterscheidet sich von der alten Zeichenfolge, Teilzeichenfolge vorhanden ist
InformationsquelleAutor der Antwort ride
Meine .bash_profile und wie ich grep verwendet
wenn der PFAD inklusive meiner 2 bin dirs nicht, fügen Sie diese
InformationsquelleAutor der Antwort Leslie Satenstein
Ich finde diese Funktion Recht Häufig, so dass ich mit einem home-made-shell-Funktion in meinem
.bashrc
wie diese, die mir erlaubt, zu re-verwenden Sie es so oft, wie ich benötige, mit einem leicht zu merkenden Namen:Um zu testen, ob
$string1
(sagen, abc) enthalten ist, in$string2
(sagen, 123abcABC) ich muss nur nochstringinstring "$string1" "$string2"
und überprüfen Sie den Rückgabewert, zum BeispielInformationsquelleAutor der Antwort Kurt Pfeifle
Versuchen oobash es ist ein OO-Stil string-Bibliothek für die bash-4. Es hat Unterstützung für Deutsche Umlaute. Es ist geschrieben in bash. Viele Funktionen stehen zur Verfügung:
-base64Decode
-base64Encode
-capitalize
-center
-charAt
-concat
-contains
-count
-endsWith
-equals
-equalsIgnoreCase
-reverse
-hashCode
-indexOf
-isAlnum
-isAlpha
-isAscii
-isDigit
-isEmpty
-isHexDigit
-isLowerCase
-isSpace
-isPrintable
-isUpperCase
-isVisible
-lastIndexOf
-length
-matches
-replaceAll
-replaceFirst
-startsWith
-substring
-swapCase
-toLowerCase
-toString
-toUpperCase
-trim
und-zfill
.Blick auf die enthält Beispiel:
oobash ist erhältlich bei Sourceforge.net.
InformationsquelleAutor der Antwort andreas
Exakte Wortsuche:
InformationsquelleAutor der Antwort Eduardo Cuomo
Ich diese Funktion (eine Abhängigkeit, die nicht im Lieferumfang enthalten, aber offensichtlich). Besteht er die tests unten gezeigt. Wenn die Funktion einen Wert > 0, dann ist der string gefunden wurde. Sie könnten genauso einfach wieder 1 oder 0 statt.
InformationsquelleAutor der Antwort Ethan Post