2010-01-21 17 views
21

Çok daha büyük bir dizede küçük bir dize için grep çalışıyorum. Her iki dizeleri değişkenler olarak depolanır ve burada bir kod örneği ediliyor:Değişkenlerdeki karmaşık dizeleri nasıl grepleyebilirim?

#!/bin/bash 

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

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

Ben değişken genişleme bunu bekliyoruz şekilde çalıştığını düşünmüyorum. [ ] ve [[ ]]'u da denedim, ayrıca değişkenleri alıntılayarak ve çıkışı /dev/null'a pipettim ama ne yaparsam yapayım işe yaramaz.

Herhangi bir fikri olan var mı?

+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 –

cevap

31
echo "$long_str" | grep -q "$shrt_str" 
if [ $? -eq 0 ];then 
    echo "found" 
fi 

veya

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

istiyorum Ama: stdin olarak bir değişken kullanmak istiyorsanız o zaman bash en herestring notasyonu kullanmak gerekir bash kabuğu, daha sonra kabuk içi kullan. Gerek dış komutları

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

Güzel. Yukarıdaki durum ifadesi, orijinal 'sh' da geçerli olmalıdır. –

+1

evet, yanlış değilse de bourne üzerinde çalışmalıdır. – ghostdog74

+0

Bu mükemmel. Teşekkürler. – Craig

13

grep dosyalar veya stdin içindir. Kullandığınız beri

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

Sen

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

Başka Bash özgü tekniği:

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

Ama eğer bir değişkende uzun dize gerekmiyorsa:

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

ama ben Bunun sadece bir örnek olması amacıyla olduğunu varsayarak.

+0

= ~ çözümünü denedim ama işe yaramadı. Test man sayfası, "~" operatörünü de içermez. – Craig

+0

'= ~' bir “test” operatör değil, bir Bash operatörüdür (çift köşeli parantezleri not edin). Aynı zamanda ksh ve zsh çalışır. –

İlgili konular