3491 Stimmen

Prüfen, ob eine Zeichenkette eine Teilzeichenkette in Bash enthält

Ich habe eine Zeichenfolge in Bash:

string="My string"

Wie kann ich prüfen, ob sie eine andere Zeichenfolge enthält?

if [ $string ?? 'foo' ]; then
  echo "It's there!"
fi

Wo ?? ist mein unbekannter Operator. Verwende ich echo y grep ?

if echo "$string" | grep 'foo'; then
  echo "It's there!"
fi

Das sieht ein bisschen unbeholfen aus.

4 Stimmen

Hallo, wenn leere Zeichenfolgen falsch sind, warum halten Sie es für ungeschickt? Es war der einzige Weg, der für mich funktionierte, trotz der vorgeschlagenen Lösungen.

1 Stimmen

Sie können die expr Befehl hier

9 Stimmen

Hier ist eine für Posix-Shells: stackoverflow.com/questions/2829613/

7voto

FifthAxiom Punkte 121

Da die POSIX /BusyBox Frage geschlossen wird, ohne die richtige Antwort zu geben (IMHO), werde ich hier eine Antwort posten.

Die kürzest mögliche Antwort ist:

[ ${_string_##*$_substring_*} ] || echo Substring found!

o

[ "${_string_##*$_substring_*}" ] || echo 'Substring found!'

Beachten Sie, dass die Doppelhash es obligatorisch mit einigen Muscheln ( ash ). Oben wird bewertet [ stringvalue ] wenn die Teilzeichenkette nicht gefunden wird. Es wird kein Fehler zurückgegeben. Wenn die Teilzeichenkette gefunden wird, ist das Ergebnis leer und es wird ausgewertet [ ] . Dies führt zum Fehlercode 1, da die Zeichenkette vollständig ersetzt wird (aufgrund von * ).

Die kürzeste und gebräuchlichste Syntax:

[ -z "${_string_##*$_substring_*}" ] && echo 'Substring found!'

o

[ -n "${_string_##*$_substring_*}" ] || echo 'Substring found!'

Eine andere:

[ "${_string_##$_substring_}" != "$_string_" ] && echo 'Substring found!'

o

[ "${_string_##$_substring_}" = "$_string_" ] || echo 'Substring found!'

Beachten Sie die einzeln Gleichheitszeichen!

6voto

Leslie Satenstein Punkte 366

Meine .bash_profile Datei und wie ich grep verwendet habe:

Wenn die Umgebungsvariable PATH meine beiden bin Verzeichnisse, hängen Sie sie nicht an,

# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

U=~/.local.bin:~/bin

if ! echo "$PATH" | grep -q "home"; then
    export PATH=$PATH:${U}
fi

1 Stimmen

Ist das eine Antwort?

0 Stimmen

Upvote. warum die Mühe zu lernen, wie Bash tut es, wenn grep, weit mächtiger, ist mehr als wahrscheinlich zur Verfügung stehen. auch erweitern Sie es ein bisschen weiter durch den Abgleich gegen eine Liste von Mustern: grep -q -E 'pattern1|...|patternN' .

6voto

Alex Skrypnyk Punkte 1202

Erweiterung der hier beantworteten Frage Wie kann man in POSIX sh feststellen, ob eine Zeichenkette eine andere Zeichenkette enthält? :

Diese Lösung funktioniert auch mit Sonderzeichen:

# contains(string, substring)
#
# Returns 0 if the specified string contains the specified substring,
# otherwise returns 1.
contains() {
    string="$1"
    substring="$2"

    if echo "$string" | $(type -p ggrep grep | head -1) -F -- "$substring" >/dev/null; then
        return 0    # $substring is in $string
    else
        return 1    # $substring is not in $string
    fi
}

contains "abcd" "e" || echo "abcd does not contain e"
contains "abcd" "ab" && echo "abcd contains ab"
contains "abcd" "bc" && echo "abcd contains bc"
contains "abcd" "cd" && echo "abcd contains cd"
contains "abcd" "abcd" && echo "abcd contains abcd"
contains "" "" && echo "empty string contains empty string"
contains "a" "" && echo "a contains empty string"
contains "" "a" || echo "empty string does not contain a"
contains "abcd efgh" "cd ef" && echo "abcd efgh contains cd ef"
contains "abcd efgh" " " && echo "abcd efgh contains a space"

contains "abcd [efg] hij" "[efg]" && echo "abcd [efg] hij contains [efg]"
contains "abcd [efg] hij" "[effg]" || echo "abcd [efg] hij does not contain [effg]"

contains "abcd *efg* hij" "*efg*" && echo "abcd *efg* hij contains *efg*"
contains "abcd *efg* hij" "d *efg* h" && echo "abcd *efg* hij contains d *efg* h"
contains "abcd *efg* hij" "*effg*" || echo "abcd *efg* hij does not contain *effg*"

2 Stimmen

Der Test contains "-n" "n" funktioniert hier nicht, weil echo -n verschluckt die -n als eine Option! Eine beliebte Lösung für dieses Problem ist die Verwendung von printf "%s\n" "$string" stattdessen.

6voto

Pipo Punkte 3923

Das generische Heuhaufen von Nadeln Beispiel folgt mit Variablen

#!/bin/bash

needle="a_needle"
haystack="a_needle another_needle a_third_needle"
if [[ $haystack == *"$needle"* ]]; then
    echo "needle found"
else
    echo "needle NOT found"
fi

5voto

ride Punkte 129

Ich mag sed.

substr="foo"
nonsub="$(echo "$string" | sed "s/$substr//")"
hassub=0 ; [ "$string" != "$nonsub" ] && hassub=1

Bearbeiten, Logik:

  • Verwenden Sie sed, um eine Instanz einer Teilzeichenkette aus einer Zeichenkette zu entfernen

  • Wenn neue Zeichenkette von alter Zeichenkette abweicht, existiert Teilzeichenfolge

4 Stimmen

Bitte fügen Sie eine Erklärung hinzu. Die Vermittlung der zugrundeliegenden Logik ist wichtiger als die bloße Angabe des Codes, denn sie hilft dem Auftraggeber und anderen Lesern, dieses und ähnliche Probleme selbst zu lösen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X