Подтвердить что ты не робот

Как найти подстроку внутри строки (или как grep переменную)?

Я использую BASH, и я не знаю, как найти подстроку. Он продолжает терпеть неудачу, у меня есть строка (должен ли это быть массив?)

Ниже LIST представляет собой строковый список имен баз данных, SOURCE - это ответ, одна из этих баз данных. Следующие действия все еще не работают:

echo "******************************************************************"
echo "*                  DB2 Offline Backup Script                     *"
echo "******************************************************************"
echo "What the name of of the  database you would like to backup?"
echo "It will be named one in this list:"
echo ""
LIST=`db2 list database directory | grep "Database alias" | awk '{print $4}'`
echo $LIST
echo ""
echo "******************************************************************"
echo -n ">>> "
read -e SOURCE

if expr match "$LIST" "$SOURCE"; then
    echo "match"
    exit -1
else
    echo "no match"
fi
exit -1

Я тоже пробовал это, но не работал:

if [ `expr match "$LIST" '$SOURCE'` ]; then
4b9b3361

Ответ 1

LIST="some string with a substring you want to match"
SOURCE="substring"
if echo "$LIST" | grep -q "$SOURCE"; then
  echo "matched";
else
  echo "no match";
fi

Ответ 2

Вы также можете сравнить с подстановочными знаками:

if [[ "$LIST" == *"$SOURCE"* ]]

Ответ 3

Если вы используете bash, вы можете просто сказать

if grep -q "$SOURCE" <<< "$LIST" ; then
    ...
fi

Ответ 4

Это работает в Bash без внешних команд:

function has_substring() {
   [[ "$1" != "${2/$1/}" ]]
}

Пример использования:

name="hello/world"
if has_substring "$name" "/"
then
   echo "Indeed, $name contains a slash!"
fi

Ответ 5

Вы можете использовать "индекс", если хотите найти только один символ, например:

LIST="server1 server2 server3 server4 server5"
SOURCE="3"
if expr index "$LIST" "$SOURCE"; then
    echo "match"
    exit -1
else
    echo "no match"
fi

Выход:

23
match

Ответ 6

expr match "$LIST" '$SOURCE'

не работает из-за этой функции ищет $SOURCE от начала строки и возвращает позицию сразу после шаблона $SOURCE, если найдено else 0. Поэтому вы должны написать еще один код:

expr match "$LIST" '.*'"$SOURCE" or expr "$LIST" : '.*'"$SOURCE"

Выражение $SOURCE должно быть двойным, так как синтаксический анализатор может установить замену. Одиночная цитата не подставляется, и код выше будет искать текстовую строку $SOURCE с начала $LIST. Если вам нужно, чтобы начало строки вычитало длину $SOURCE, например ${# SOURCE}. Вы также можете написать

expr "$LIST" : ".*\($SOURCE\)"

Эта функция просто извлекает $SOURCE из $LIST и возвращает ее. Вы получите пустую строку. Но проблема с двойной двойной кавычкой. Я не знаю, как это решить без использования дополнительной переменной. Это легкое решение. Таким образом, вы можете написать на C. Существует готовая функция strstr. Не используйте индекс expr, так что это очень привлекательно. Но индексный поиск не подстрока и только первый char.

Ответ 7

expr используется вместо [а не внутри него, а переменные расширяются только внутри двойных кавычек, поэтому попробуйте следующее:

if expr match "$LIST" "$SOURCE"; then

Но я не совсем понимаю, что должен представлять SOURCE.

Похоже, ваш код будет читаться в шаблоне со стандартного ввода и выходить, если он соответствует псевдониму базы данных, иначе он будет эхом "ok". Это то, что вы хотите?

Ответ 8

Что ж, как насчет этого:

PS3="Select database or <Q> to quit: "
select DB in db1 db2 db3; do
   [ "${REPLY^*}" = 'Q' ] && break
   echo "Should backup $DB..."
done