10
votes

Est-il possible de faire un grep avec des mots-clés stockés dans le tableau?

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


2 commentaires

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


6 Réponses :


0
votes

Peut-être quelque chose comme ça; xxx

non testé!


1 commentaires

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 ?



1
votes

La commande xxx

recherche le fichier pour chaque mot clé dans un tableau. Il le fait en construisant une expression régulière word1 | word2 | word3 qui correspond à n'importe quel mot des alternatives données (en mode Perl).

Si je suis un moyen de joindre des éléments de tableau dans une chaîne, la délimitant avec séquence de caractères (nommément, \ | ), cela pourrait être effectué sans Perl Regexp.


3 commentaires

Sur mon système, c'est singulier: - perl-regexp . Aussi, utilisation inutile de chat .


(ifs ... Grep ... Nom de fichier) - Pas besoin de redirection. Est-ce que votre grep a vraiment un "s" dans - perl-regexp ?


@Dennis, non, il n'a pas "s", j'ai collé la version avec la faute de frappe.



3
votes

Ceci est un moyen: xxx

EDIT:

basé sur Suggestion Pavel Shved: xxx

la première version en tant que doublure: xxx

EDIT2:

Même mieux que la version utilisant ifs : xxx


2 commentaires

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 [@] /% / \\ |} dit pour remplacer ( / ) la fin (% ) de chaque élément de la matrice ( args [@] ) avec ( / ) une barre oblique inverse et un tuyau ( \\ | ). Donc, il ajoute ces caractères depuis la "extrémité" (un % suivi par aucun autre caractères à correspondre) est juste que - aucun caractère n'est supprimé pendant le "remplacement" dans ce cas.



13
votes
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"

0 commentaires

6
votes

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


0 commentaires

2
votes

J'ai tendance à utiliser la substitution de processus pour tout. Il est pratique lorsqu'il est combiné avec grep 'S -f option:

Obtenez des motifs du fichier, un par ligne.

(selon le contexte, vous pouvez même vouloir combiner cela avec -x ou -w pour des effets géniaux.) < p> donc: xxx

et je reçois: xxx

i Ecrivez fondamentalement un pseudo-fichier avec un élément de la Array par ligne, puis indiquez grep d'utiliser chacune de ces lignes comme motif.


0 commentaires