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/

5voto

grep -q ist für diesen Zweck nützlich.

Das Gleiche mit awk :

string="unix-bash 2389"
character="@"
printf '%s' "$string" | awk -vc="$character" '{ if (gsub(c, "")) { print "Found" } else { print "Not Found" } }'

Ausgabe:

Nicht gefunden

string="unix-bash 2389"
character="-"
printf '%s' "$string" | awk -vc="$character" '{ if (gsub(c, "")) { print "Found" } else { print "Not Found" } }'

Ausgabe:

Gefunden

Ursprüngliche Quelle: http://unstableme.blogspot.com/2008/06/bash-search-letter-in-string-awk.html

3 Stimmen

echo nicht portabel ist, sollten Sie die printf '%s' "$string" stattdessen. Ich bearbeite die Antwort, weil der Benutzer nicht mehr zu existieren scheint.

0 Stimmen

Auf welche Weise ist echo nicht tragbar, @nyuszika7h?

4voto

Kurt Pfeifle Punkte 81768

Ich habe festgestellt, dass ich diese Funktionalität recht häufig benötige, daher verwende ich eine selbst erstellte Shell-Funktion in meinem .bashrc So kann ich sie beliebig oft wiederverwenden, und der Name ist leicht zu merken:

function stringinstring()
{
    case "$2" in
       *"$1"*)
          return 0
       ;;
    esac
    return 1
}

Um zu prüfen, ob $string1 (sagen wir, abc ) ist enthalten in $string2 (sagen wir, 123abcABC ) Ich muss nur noch die stringinstring "$string1" "$string2" und prüfen Sie den Rückgabewert, zum Beispiel

stringinstring "$str1" "$str2"  &&  echo YES  ||  echo NO

0 Stimmen

[[ "$str" == $substr ]] && echo YES || echo NO

0 Stimmen

Ich bin mir ziemlich sicher, dass die x hack ist nur erforderlich für sehr alte Muscheln.

0 Stimmen

Der richtige -- und sofort erkennbare -- Name für Ihre Funktion wäre strstr() :-)

4voto

Koichi Nakashima Punkte 591
case $string in (*foo*)
  # Do stuff
esac

Dies ist die gleiche Antwort wie https://stackoverflow.com/a/229585/11267590 . Aber einfachen Stil und auch POSIX-kompatibel.

3voto

Eduardo Cuomo Punkte 15791

Genaue Wortübereinstimmung:

string='My long string'
exactSearch='long'

if grep -E -q "\b${exactSearch}\b" <<<${string} >/dev/null 2>&1
  then
    echo "It's there"
  fi

2voto

franzisk Punkte 1529

Sie können eine Logik verwenden && kompakter zu sein

#!/bin/bash

# NO MATCH EXAMPLE
string="test"
[[ "$string" == *"foo"* ]] && {
        echo "YES"
}

# MATCH EXAMPLE
string="tefoost"
[[ "$string" == *"foo"* ]] && {
        echo "YES"
}

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