grep sur une variable

Disons que j'ai une variable

line="This is where we select from a table." 

maintenant je veux grep combien de fois ne sélectionne pas se produire dans la phrase.

 grep -ci "select" $line 

J'ai essayé ça, mais ça n'a pas marché. J'ai aussi essayé

 grep -ci "select" "$line" 

Ça ne marche toujours pas. Je reçois l'erreur suivante.

 grep: This is where we select from a table.: No such file or directory 

Avoir grep lu sur son input standard. Là vous allez, en utilisant une pipe …

 $ echo "$line" | grep select 

… ou une string ici …

 $ grep select <<< "$line" 

En outre, vous souhaiterez peut-être replace les espaces par des returns à la ligne avant de grepping:

 $ echo "$line" | tr ' ' '\n' | grep select 

… ou vous pouvez requestr à grep d'imprimer le match uniquement:

 $ echo "$line" | grep -o select 

Cela vous permettra de vous débarrasser du rest de la ligne quand il y a un match.

Edit: Oups, lisez un peu trop vite, merci Marco . Pour countr les occurrences, il suffit de les envoyer à wc(1) 😉

Une autre modification effectuée après le commentaire de lzkata , citant $line lors de l'utilisation de echo .

 test=$line i=0 while case "$test" in (*select*) test=${test#*select};;(*) ! :;; esac; do i=$(($i+1)); done 

Vous n'avez pas besoin d'appeler grep pour une chose aussi simple.

Ou comme une fonction:

 occur() while case "$1" in (*"$2"*) set -- \ "${1#*"$2"}" "$2" "${3:-0}" "$((${4:-0}+1))";; (*) return "$((${4:-0}<${3:-1}))";;esac do : "${_occur:+$((_occur=$4))}";done 

Cela prend 2 ou 3 arguments. Fournir plus que cela fera biaiser ses résultats. Vous pouvez l'utiliser comme:

 _occur=0; occur ... . 2 && echo "count: $_occur" 

… qui affiche le nombre d'occurrences de . dans ... si cela se produit au less 2 fois. Comme ça:

 count: 3 

Si $_occur est soit vide, soit $_occur il n'affectera aucune variable du shell et return 1 si "$2" se produit dans "$1" less que "$3" fois. Ou, s'il est appelé avec seulement deux arguments, il return 1 seulement si "$2" n'est pas dans "$1" . Sinon, il renvoie 0.

Et ainsi, dans sa forme la plus simple, vous pouvez faire:

 occur '' . && echo yay || echo shite 

… qui imprime …

 shite 

…mais…

 occur . . && echo yay || echo shite 

… imprimera …

 yay 

Vous pouvez également écrire un peu différemment et omettre les guillemets autour de $2 dans les deux instructions (*"$2"*) et "${1#*"$2"}" . Si vous faites cela, vous pouvez utiliser des globs shell pour des matches comme sh[io]te pour le test de correspondance.