web-dev-qa-db-fra.com

Comment puis-je grep des chaînes complexes dans des variables?

J'essaie de chercher une petite chaîne dans une chaîne beaucoup plus grande. Les deux chaînes sont stockées en tant que variables et voici un exemple de code:

#!/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 m'y attendais. J'ai essayé [ ] et [[ ]], en citant également les variables et en redirigeant la sortie vers /dev/null mais peu importe ce que je fais, ça ne marchera pas.

Quelqu'un a-t-il une idée?

28
Craig
if echo "$long_str" | grep -q "$shrt_str";then
  echo "found"
fi

ou

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

Mais puisque vous utilisez bash Shell, utilisez alors les internes de Shell. Pas besoin d'appeler des commandes externes

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

grep est pour les fichiers ou stdin. Si vous souhaitez utiliser une variable en tant que stdin, vous devez utiliser la notation hérestring de bash:

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

Tu veux

if echo $long_str | grep -q $shrt_str; then
9
Alok Singhal

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 suppose que c'était juste pour avoir un exemple.

7
Dennis Williamson