10
votes

Awk extraire plusieurs groupes de chaque ligne

Comment puis-je effectuer une action sur tous les groupes correspondants lorsque le motif correspond à plusieurs fois dans une ligne?

Pour illustrer, je souhaite rechercher / bonjour! (\ d +) / et utilisez les chiffres, par exemple, imprimez-les ou résumez-les, donc pour l'entrée xxx

Si j'ai décidé de les imprimer, Je m'attendrais à la sortie de xxx


1 commentaires

Pour Googlers: Notez que avec GAWK , AKA. "GNU AWK", vous pouvez réellement faire ce que le titre dit (pas la question) d'une ligne (par exemple via. Tuyauterie): | gawk -v rs = '' '{print Gensub (/ ((() () /, "\\ 1 \\ 2", "g"); } ': d Ceci prend en charge la multi-ligne (en raison du -v rs =' ') et de la correspondance de sous-groupes (en raison de l'utilisation de GENSUB ) !!!


4 Réponses :


1
votes

gnu awk xxx


1 commentaires

Nice, mais ne fonctionnera pas pour des motifs plus complexes comme / ([a-g] + | [h-z] +) / et correspondra sur une surface limite.



2
votes

Ceci est GAWK code> Syntaxe. Cela fonctionne également pour les modèles lorsqu'il n'y a pas de texte fixe pouvant fonctionner comme séparateur d'enregistrement et ne correspond pas sur la ligne de ligne:

 {
     pattern = "([a-g]+|[h-z]+)"
     while (match($0, pattern, arr))
     {
         val = arr[1]
         print val
         sub(pattern, "")
     }
 }


1 commentaires

Que sous à la fin fait une énorme différence! Malheureusement, ça m'a pris un peu de temps pour l'essayer ... merci!



13
votes

Ceci est une syntaxe simple, et chaque awk (Nawk, Mawk, Gawk, etc.) peut l'utiliser.

{
    while (match($0, /Hello! [0-9]+/)) {
        pattern = substr($0, RSTART, RLENGTH);
        sub(/Hello! /, "", pattern);
        print pattern;
        $0 = substr($0, RSTART + RLENGTH);
    }
}


0 commentaires

0
votes

Il n'y a pas de fonction GAWK pour correspondre au même motif plusieurs fois dans une ligne. Sauf si vous savez exactement combien de fois le modèle répète.

Ayant cela, vous devez itérer "manuellement" sur tous les matchs de la même ligne. Pour votre exemple d'entrée, ce serait: xxx

si le motif doit correspondre sur une surface limite, vous devez modifier le séparateur d'enregistrement d'entrée - RS


0 commentaires