Как проверить, содержит ли строка подстроку в Bash - PullRequest
2116 голосов
/ 23 октября 2008

У меня есть строка в Bash:

string="My string"

Как проверить, содержит ли она еще одну строку?

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

Где ?? - мой неизвестный оператор. Я использую эхо и grep?

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

Это выглядит немного неуклюже.

Ответы [ 22 ]

11 голосов
/ 01 января 2015

Как Павел упомянул в своем сравнении производительности:

if echo "abcdefg" | grep -q "bcdef"; then
    echo "String contains is true."
else
    echo "String contains is not true."
fi

Это POSIX-совместимый, как и ответ 'case' $ string 'in', предоставленный Маркусом, но его немного легче читать, чем ответ оператора case. Также обратите внимание, что это будет намного медленнее, чем использование оператора case, как указал Пол, не используйте его в цикле.

10 голосов
/ 26 августа 2013

Этот ответ переполнения стека был единственным, кто перехватил пробел и тире:

# For null cmd arguments checking   
to_check=' -t'
space_n_dash_chars=' -'
[[ $to_check == *"$space_n_dash_chars"* ]] && echo found
9 голосов
/ 11 ноября 2011

Один из них:

[ $(expr $mystring : ".*${search}.*") -ne 0 ] && echo 'yes' ||  echo 'no'
8 голосов
/ 28 апреля 2015
[[ $string == *foo* ]] && echo "It's there" || echo "Couldn't find"
5 голосов
/ 21 декабря 2008

grep -q полезно для этой цели.

То же самое, используя awk:

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

Выход:

Не найдено

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

Выход:

Найдено

Оригинальный источник: http://unstableme.blogspot.com/2008/06/bash-search-letter-in-string-awk.html

5 голосов
/ 14 января 2017

Мой .bash_profile и как я использовал grep если в PATH включены мои две папки, не добавляйте их

# .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
5 голосов
/ 03 марта 2016

Мне нравится Сед.

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

Редактировать, Логика:

  • Используйте sed для удаления экземпляра подстроки из строки

  • Если новая строка отличается от старой, существует подстрока

4 голосов
/ 01 июля 2012

Я обнаружил, что эта функция нужна довольно часто, поэтому я использую самодельную функцию оболочки в моем .bashrc, как это, что позволяет мне использовать ее так часто, как мне нужно, с легкостью запоминать имя:

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

Чтобы проверить, содержится ли $string1 (скажем, abc ) в $string2 (скажем, 123abcABC ), мне просто нужно запустить stringinstring "$string1" "$string2" и проверить возврат значение, например

stringinstring "$str1" "$str2"  &&  echo YES  ||  echo NO
3 голосов
/ 02 февраля 2019

Продолжение вопроса, на которое здесь дан ответ https://stackoverflow.com/a/8811800/712666

Это решение работает со специальными символами:

# 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*"
3 голосов
/ 10 ноября 2016

Точное совпадение слов:

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

if grep -E -q "\b${exactSearch}\b" <<<${string} >/dev/null 2>&1
  then
    echo "It's there"
  fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...