8
votes

BASH Script pour extraire toutes les correspondances d'un motif de regex

J'ai trouvé cela, mais cela suppose que les mots sont des espaces séparés.

data="abcdefADDNAME25abcdefgHELLOabcdefgADDNAME25abcdefgHELLOabcdefg"
for word in $data
do
    if echo $word | grep -qi '(ADDNAME\d\d.*HELLO)'
    then
        match="$match $word"
    fi
done
echo $match


4 commentaires

J'ai du mal à avoir du sens de votre script. Est $ World supposé correspondre à $ résultat ? Il n'y a rien dans votre modèle qui ne correspondra rien dans $ World cependant. Pouvez-vous montrer un meilleur exemple de la chaîne que vous essayez de correspondre et le modèle que vous essayez d'utiliser?


J'ai édité le poste, il a été mal indiqué.


Il n'est toujours pas clair ce que vous recherchez. Maintenant, pour Word en $ résultat ne voit qu'un "mot" (la chaîne totale contenue dans résultant . Que voulez-vous $ match pour contenir à la fin?


Je veux extraire toutes les occurrences du motif de regex à l'intérieur du var "résultat". Le Var "Match" doit contenir toutes les correspondances extraites chacune séparées par un espace.


3 Réponses :


8
votes

Utiliser grep -o

-O, montrant une correspondance, seule la partie d'un motif de correspondance de ligne


1 commentaires

7 ans plus tard, c'était exactement ce dont j'avais besoin



14
votes

Edit: Réponse à la question modifiée: xxx

réponse originale:

si vous utilisez Bash version 3.2 ou plus, vous pouvez utiliser sa correspondance de regex. xxx

Le résultat sera "99 88 42".


4 commentaires

J'ai édité mon message: ma chaîne n'a pas d'espaces, il ne fonctionnera donc pas.


Pourquoi ne pas raccourcir un peu: ... faire; [[$ word = ~ $ motif]] && match = "$ {match: + match} $ {bash_rematch [0]}"; Fini


@ user377178: C'est une question de choix de style et de lisibilité. Choisissez ce qui fonctionne mieux pour une circonstance particulière.


Pourquoi la substitution des paramètres avec la variable "correspondance"? Je ne comprends pas le but de celui-ci.



0
votes

pas très élégant - et il y a des problèmes en raison de la correspondance gourmande - mais de plus ou moins de travaux: xxx

La première boucle échoe trois lignes de données - vous remplacerez probablement cela avec Cat ou I / O Redirection. Le script sed utilise une regex modifiée pour mettre des espaces autour des motifs. La dernière boucle brise les "mots séparés de l'espace" dans un "mot" par ligne. La finale grep sélectionne les lignes que vous voulez.

La regex est modifiée avec [AZ] * à la place de l'original . * / code> parce que le motif correspondant est gourmand. Si les données entre Addname et Hello sont non contraries, vous devez penser à utiliser des regex non gourmandes, disponibles en Perl et probablement python et d'autres langages de script modernes: xxx

C'est une bonne démonstration d'utiliser le droit aussi pour le travail.


0 commentaires