2010-01-21 10 views
21

J'essaye de grep pour une petite chaîne dans une chaîne beaucoup plus grande. Les deux chaînes sont stockées sous forme de variables et voici un exemple de code:Comment puis-je grep des chaînes complexes dans des variables?

#!/bin/bash 

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

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

Je ne pense pas que l'expansion variable fonctionne comme je l'attends à. J'ai essayé [ ] et [[ ]], en citant également les variables et en canalisant la sortie à /dev/null mais n'importe ce que je fais ne fonctionnera pas.

Quelqu'un a-t-il des idées?

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

Répondre

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

ou

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

Mais puisque vous utilisez bash shell, puis utilisez les internes du shell. Pas besoin d'appeler des commandes externes

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

Nice. La déclaration de cas ci-dessus devrait être valide dans le 'sh' d'origine aussi. –

+1

oui, ça devrait marcher sur bourne aussi, sinon se tromper. – ghostdog74

+0

C'est parfait. Merci. – Craig

13

grep est pour les fichiers ou stdin. Si vous souhaitez utiliser une variable comme stdin alors vous devez utiliser la notation herestring de bash:

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

Vous voulez

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

Une autre technique spécifique à Bash:

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

Mais si vous n'avez pas besoin de la longue chaîne dans une variable:

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

mais je Je suppose que c'était juste pour avoir un exemple.

+0

J'ai essayé la solution = ~ mais cela n'a pas fonctionné. La page de manuel de test n'inclut pas non plus le "~" en tant qu'opérateur. – Craig

+0

'= ~' n'est pas un opérateur 'test', c'est un opérateur Bash (notez les doubles crochets). Cela fonctionne également dans ksh et zsh. –

Questions connexes