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 Si j'ai décidé de les imprimer, Je m'attendrais à la sortie de p> / bonjour! (\ d +) / code> et utilisez les chiffres, par exemple, imprimez-les ou résumez-les, donc pour l'entrée p>
4 Réponses :
gnu awk
Nice, mais ne fonctionnera pas pour des motifs plus complexes comme / ([a-g] + | [h-z] +) / et correspondra sur une surface limite.
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, "")
}
}
Que sous code> à la fin fait une énorme différence! Malheureusement, ça m'a pris un peu de temps pour l'essayer ... merci!
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); } }
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: p> si le motif doit correspondre sur une surface limite, vous devez modifier le séparateur d'enregistrement d'entrée - RS P> P >
Pour Googlers: Notez que avec
GAWK code>, 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"); } ' code>: d Ceci prend en charge la multi-ligne (en raison du
-v rs =' ' code>) et de la correspondance de sous-groupes (en raison de l'utilisation de
GENSUB code>) !!!