2010-01-21 20 views
21

我想grep爲更大的字符串中的小字符串。這兩個字符串被存儲爲變量,這裏是一個代碼示例:如何在變量中複雜的字符串?

#!/bin/bash 

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

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

我不認爲變量擴展工作,我希望它的方式。我試過[ ][[ ]],也引用了變量並將輸出管道輸送到/dev/null,但不管我做什麼都行不通。

有沒有人有任何想法?

+0

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 – 2017-06-01 16:15:29

回答

31
echo "$long_str" | grep -q "$shrt_str" 
if [ $? -eq 0 ];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

不錯。上面的案例陳述應該在原始'sh'中也是有效的。 – 2010-01-21 02:55:13

+1

是的,如果沒有錯誤的話,它也應該用於伯恩。 – ghostdog74 2010-01-21 03:15:03

+0

這是完美的。謝謝。 – Craig 2010-01-21 03:38:23

13

grep用於文件或標準輸入。如果你想使用一個變量作爲標準輸入,那麼你需要使用bash的herestring符號:由於您使用

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

你想

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

另一個Bash特殊技術:

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

但是,如果你並不需要在變量的長字符串:

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

但我假設這只是爲了舉例說明。

+0

我試過=〜解決方案,但沒有奏效。測試手冊頁面也不包括「〜」作爲操作員。 – Craig 2010-01-21 08:09:07

+0

'=〜'不是'test'運算符,它是一個Bash運算符(注意雙方括號)。它也適用於ksh和zsh。 – 2010-01-21 10:24:08

相關問題