Как проверить, содержит ли строка подстроку в 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 ]

3 голосов
/ 27 августа 2010

Попробуйте oobash, это библиотека строк в стиле OO для bash 4. Она поддерживает немецкие умлауты. Это написано на bash. Доступно множество функций: -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 и -zfill.

Посмотрите на содержащийся пример:

[Desktop]$ String a testXccc                                                  
[Desktop]$ a.contains tX                   
true                                                           
[Desktop]$ a.contains XtX      
false      

oobash доступен на Sourceforge.net .

2 голосов
/ 11 апреля 2018

Я использую эту функцию (одна зависимость не включена, но очевидна). Он проходит испытания, показанные ниже. Если функция возвращает значение> 0, то строка была найдена. Вы могли бы так же легко вернуть 1 или 0 вместо этого.

function str_instr {
   # Return position of ```str``` within ```string```.
   # >>> str_instr "str" "string"
   # str: String to search for.
   # string: String to search.
   typeset str string x
   # Behavior here is not the same in bash vs ksh unless we escape special characters.
   str="$(str_escape_special_characters "${1}")"
   string="${2}"
   x="${string%%$str*}"
   if [[ "${x}" != "${string}" ]]; then
      echo "${#x} + 1" | bc -l
   else
      echo 0
   fi
}

function test_str_instr {
   str_instr "(" "'foo@host (dev,web)'" | assert_eq 11
   str_instr ")" "'foo@host (dev,web)'" | assert_eq 19
   str_instr "[" "'foo@host [dev,web]'" | assert_eq 11
   str_instr "]" "'foo@host [dev,web]'" | assert_eq 19
   str_instr "a" "abc" | assert_eq 1
   str_instr "z" "abc" | assert_eq 0
   str_instr "Eggs" "Green Eggs And Ham" | assert_eq 7
   str_instr "a" "" | assert_eq 0
   str_instr "" "" | assert_eq 0
   str_instr " " "Green Eggs" | assert_eq 6
   str_instr " " " Green "  | assert_eq 1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...