Disons que j'ai une variable
line="This is where we select from a table."
maintenant je veux grep combien de fois la sélection se produit-elle 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. J'obtiens l'erreur suivante.
grep: This is where we select from a table.: No such file or directory
Demandez à grep
de lire sur son entrée standard. Voilà, en utilisant n tuya ...
$ echo "$line" | grep select
... ou ne chaîne ici ...
$ grep select <<< "$line"
En outre, vous souhaiterez peut-être remplacer les espaces par des sauts de ligne avant de lancer une grepping:
$ echo "$line" | tr ' ' '\n' | grep select
... ou vous pouvez demander à grep
d'imprimer uniquement la correspondance:
$ echo "$line" | grep -o select
Cela vous permettra de vous débarrasser du reste de la ligne en cas de match.
Edit: Oups, lisez un peu trop vite, merci Marco . Afin de compter les occurrences, il suffit de diriger n'importe lequel de ces événements vers 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 en 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 faussera 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 moins 2 fois. Comme ça:
count: 3
Si $_occur
est soit vide, soit unset
lorsqu'il est invoqué, il n'affectera aucune variable Shell et return
1 si "$2"
se produit dans "$1"
moins que "$3"
fois. Ou, s'il est appelé avec seulement deux arguments, il ne sera return
1 que si "$2"
n'est pas dans "$1"
. Sinon, il renvoie 0.
Et donc, 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 l'écrire un peu différemment et omettre les guillemets autour de $2
dans les deux (*"$2"*)
et "${1#*"$2"}"
déclaration. Si vous faites cela, vous pouvez utiliser des globes Shell pour des correspondances comme sh[io]te
pour le test de correspondance.