2010-01-21 4 views
21

Ich versuche, nach einer kleinen Saite in einer viel größeren Saite zu suchen. Beide Strings werden als Variablen gespeichert und hier ist ein Codebeispiel:Wie greife ich komplexe Strings in Variablen?

#!/bin/bash 

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

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

Ich glaube nicht, variable Erweiterung funktioniert so, wie ich es erwarten. Ich habe versucht [ ] und [[ ]], auch zitiert die Variablen und Rohrleitungen die Ausgabe zu /dev/null aber egal was ich tun wird es nicht funktionieren.

Hat jemand irgendwelche Ideen?

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

Antwort

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

oder

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

Aber da Sie verwenden Bash-Shell, dann Shell Internals verwenden. Keine Notwendigkeit, externe Befehle

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

Nizza. Die obige case-Anweisung sollte auch im ursprünglichen 'sh' gültig sein. –

+1

ja, sollte es auch auf bourne funktionieren, wenn nicht falsch. – ghostdog74

+0

Das ist perfekt. Vielen Dank. – Craig

13

grep ist für Dateien oder Standard. Wenn Sie eine Variable als stdin verwenden möchten, dann müssen Sie bash herestring Notation verwenden:

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

Sie wollen

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

Eine weitere Bash-spezifische Technik zu nennen:

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

Aber wenn Sie brauchen nicht den langen String in einer Variablen:

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

aber ich Ich gehe davon aus, dass das nur ein Beispiel war.

+0

Ich habe versucht die = ~ Lösung, aber es hat nicht funktioniert. Die Testman-Seite enthält auch nicht das "~" als Operator. – Craig

+0

'= ~' ist kein 'Test'-Operator, es ist ein Bash-Operator (beachten Sie die doppelten eckigen Klammern). Es funktioniert auch in ksh und zsh. –