est-il possible de faire un grep avec des mots-clés stockés dans la matrice.
Voici l'extrait de code possible; Comment puis-je le corriger? P>
args=("key1" "key2" "key3") cat file_name |while read line echo $line | grep -q -w ${args[c]} done
6 Réponses :
Peut-être quelque chose comme ça; non testé! p> p> p>
Eh bien, j'ai besoin de rechercher les mots-clés en même temps quelque chose comme $ {args [*]} ou avec Egrep avec plusieurs mots-clés. Une idée ?
La commande recherche le fichier pour chaque mot clé dans un tableau. Il le fait en construisant une expression régulière Si je suis un moyen de joindre des éléments de tableau dans une chaîne, la délimitant avec séquence em> de caractères (nommément, word1 | word2 | word3 code> qui correspond à n'importe quel mot des alternatives données (en mode Perl). P>
\ | code>), cela pourrait être effectué sans Perl Regexp. P> P>
Sur mon système, c'est singulier: - perl-regexp code>. Aussi, utilisation inutile de
chat code>.
(ifs ... Grep ... Nom de fichier) Code> - Pas besoin de redirection. Est-ce que votre
grep code> a vraiment un "s" dans
- perl-regexp code>?
@Dennis, non, il n'a pas "s", j'ai collé la version avec la faute de frappe.
Ceci est un moyen: basé sur Suggestion forte> Pavel Shved: p> la première version en tant que doublure: p> Même mieux que la version utilisant ifs code>: p>
Pouvez-vous expliquer comment votre solution fonctionne? Je suis coincé à comprendre le but de% dans votre modèle args [@] /% / \\ |
@Sharad: Regardez dans le manuel Bash à l'expansion du paramètre shell] ( gnu.org/software/bash/manual/... ) auberge à côté du dernier paragraphe. L'affectation dans mon exemple keys = $ {args [@] /% / \\ |} code> dit pour remplacer (
/ code>) la fin (
% code >) de chaque élément de la matrice (
args [@] code>) avec (
/ code>) une barre oblique inverse et un tuyau (
\\ | code>). Donc, il ajoute ces caractères depuis la "extrémité" (un
% code> suivi par aucun autre caractères à correspondre) est juste que - aucun caractère n'est supprimé pendant le "remplacement" dans ce cas.
args=("key1" "key2" "key3") while read -r line do for i in ${args[@]} do case "$line" in *"$i"*) echo "found: $line";; esac done done <"file"
Vous pouvez utiliser une magie d'expansion Bash pour préfixer chaque élément de -e -E et transmettre chaque élément de la matrice en tant que motif séparé. Cela peut éviter certains problèmes de priorité où vos motifs peuvent interagir mal avec le | Opérateur:
$ grep ${args[@]/#/-e } file_name
J'ai tendance à utiliser la substitution de processus pour tout. Il est pratique lorsqu'il est combiné avec Obtenez des motifs du fichier, un par ligne. P>
blockQuote> (selon le contexte, vous pouvez même vouloir combiner cela avec et je reçois: p> i Ecrivez fondamentalement un pseudo-fichier avec un élément de la Array par ligne, puis indiquez grep code> 'S
-f code> option:
-x code> ou
-w code> pour des effets géniaux.) p> < p> donc: p>
grep code> d'utiliser chacune de ces lignes comme motif. p> p>
Bien que ce ne soit pas vraiment une solution, mais le chat est utilisé pour concaténer des fichiers, s'il n'existe qu'un seul fichier, utilisez la directive d'entrée: lors de la ligne de lecture Echo $ Line | grep -q -w $ {args [c]} fait EN. Wikipedia.org/wiki/CAT_%28UNIX%29#USESSURES_USE_OF_CAT
Merci beaucoup .. je suis habitué à le faire en voyant d'autres exemples. Je ne le réalisais pas .. merci une tonne