Как я могу grep сложные строки в переменных? - PullRequest
28 голосов
/ 21 января 2010

Я пытаюсь найти маленькую строку в намного большей строке. Обе строки хранятся в виде переменных, и вот пример кода:

#!/bin/bash

long_str=$(man man)
shrt_str="guide"

if grep -q $shrt_str $long_str ; then
        echo "Found it!"
fi

Я не думаю, что расширение переменных работает так, как я ожидаю. Я пробовал [ ] и [[ ]], также цитируя переменные и передавая вывод в /dev/null, но независимо от того, что я делаю, это не сработает.

У кого-нибудь есть идеи?

Ответы [ 4 ]

38 голосов
/ 21 января 2010
if echo "$long_str" | grep -q "$shrt_str";then
  echo "found"
fi

или

echo "$long_str" | grep  -q  "$shrt_str"  && echo "found" || echo "not found"

Но так как вы используете оболочку bash, используйте внутреннюю оболочку. Не нужно вызывать внешние команды

shrt_str="guide"
case "$long_str" in 
   *"$shrt_str"* ) echo "Found";;
   * ) echo "Not found";;
esac
21 голосов
/ 21 января 2010

grep для файлов или стандартного ввода. Если вы хотите использовать переменную в качестве стандартного ввода, тогда вам нужно использовать обозначение bash herestring:

if grep -q "$shrt_str" <<< "$long_str" ; then
9 голосов
/ 21 января 2010

Вы хотите

if echo $long_str | grep -q $shrt_str; then
7 голосов
/ 21 января 2010

Другая техника, специфичная для Bash:

if [[ $long =~ $short ]]    # regex match
then
    echo "yes"
fi

Но если вам не нужна длинная строка в переменной:

if man man | grep $short; then ...

но я предполагаю, что это просто для того, чтобы иметь пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...