J'ai un motif regex qui est censé correspondre à plusieurs endroits dans une chaîne. Je veux obtenir tous les groupes de correspondance dans un tableau et ensuite imprimer chaque élément.Bash regex ungreedy match
Alors, je l'ai essayé ceci:
#!/bin/bash
f=$'\n\tShare1 Disk\n\tShare2 Disk\n\tPrnt1 Printer'
regex=$'\n\t(.+?)\\s+Disk'
if [[ $f =~ $regex ]]
then
for match in "${BASH_REMATCH[@]}"
do
echo "New match: $match"
done
else
echo "No matches"
fi
Résultat:
New match:
Share1 Disk
Share2 Disk
New match: Share1 Disk
Share2
Le résultat attendu aurait été
New match: Share1
New match: Share2
Je pense que cela ne fonctionne pas parce que mon .+?
correspond à gourmand. J'ai donc cherché comment cela pouvait être accompli avec bash regex. Mais tout le monde semble suggérer d'utiliser grep avec perl regex.
Mais il doit sûrement y avoir un autre moyen. Je pensais peut-être quelque chose comme [^\\s]+
.. Mais la sortie de c'était:
New match:
Share1 Disk
New match: Share1
... Toutes les idées?
Une idée serait d'utiliser '[^ \\ s] +' la place? de '. +?'. Cela correspondra aux caractères jusqu'à ce qu'un espace soit trouvé. – Rahul
@Rahul ou '\ S +?' –
Les deux produisent le même résultat que '[^ \\ s] +' que j'ai déjà mentionné dans ma question. Je ne pense pas que le '?' Est même supporté dans bash, je veux dire dans ce contexte .. Je veux dire un '?' Derrière un '+' signifie généralement 'match ungreedy'. – Forivin