如何在变量中使用grep查找复杂的字符串?

30

我想要在一个很大的字符串中通过 grep 查找一个小字符串。这两个字符串都已经被存储为变量,下面是一个代码示例:

#!/bin/bash

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

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

我觉得变量扩展不是按照我的预期工作的。我已经尝试过使用[ ][[ ]],也引用了变量并将输出导入到/dev/null,但无论我做什么都不起作用。

有人有什么想法吗?


https://superuser.com/questions/748724/pass-a-large-string-to-grep-instead-of-a-file-name | https://unix.stackexchange.com/questions/163810/grep-on-a-variable将大字符串传递给grep而不是文件名 | 在变量上使用grep - Ciro Santilli OurBigBook.com
4个回答

42
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 shell,因此请使用shell内部命令。无需调用外部命令。

shrt_str="guide"
case "$long_str" in 
   *"$shrt_str"* ) echo "Found";;
   * ) echo "Not found";;
esac

1
不错。上述的case语句在原始的sh中也应该是有效的。 - Alok Singhal
@ghostdog74 在网上找到的最好的关于如何grep字符串(而不是文件)的示例。谢谢。 - james
最好调用外部命令,这样你就不会过于依赖于 shell。 - fiatjaf
这在我的Solaris 9上不起作用。但是这个可以:echo "$long_str" | grep ``cat -`` "$shrt_str" (对于双反引号我很抱歉,还没有找到其他转义方法)。 - saulius2

24

grep适用于文件或stdin。如果您想使用变量作为stdin,则需要使用bash的herestring符号:

if grep -q "$shrt_str" <<< "$long_str" ; then

9

You want

if echo $long_str | grep -q $shrt_str; then

9

另一个Bash特有的技巧:

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

但是如果您不需要将长字符串存储为变量:

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

但我假设那只是为了举个例子。

我尝试了=的解决方案,但它没有起作用。测试手册也没有包括“”作为运算符。 - Craig
1
=~ 不是一个 test 操作符,它是 Bash 操作符(注意双方括号)。它也适用于 ksh 和 zsh。 - Dennis Williamson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接