Comment grep une chaîne jusqu'à la boucle en bash?
Je travaille sur un script de compression de fichiers. Je veux faire un "jusqu'à ce que la boucle" jusqu'à ce que " le contenu de la variable correspond au modèle. Le script utilise zenity. C'est la partie importante:
part="0"
pattern="^([0-9]{1}[0-9]*([km])$"
until `grep -E "$pattern" "$part"` ; do
part=$(zenity --entry \
--title="Zip the file" \
--text "Choose the size of divided parts:
(0 = no division, *m = *mb, *k = *kb)" \
--entry-text "0");
if grep -E "$pattern" "$part" ; then
zenity --warning --text "Wrong text entry, try again." --no-cancel;
fi
done
Je veux qu'il accepte chaîne de caractères contenant des chiffres terminant par 'k' ou 'm' (mais pas deux) et n'acceptez pas de chaîne qui commence avec '0'.
Est le modèle ok?
Attendre, c'est la question de savoir si le motif est ok? Ou avez-vous des problèmes avec le script en entier? Si vous vous souciez seulement de la répétition, vous pouvez grandement simplifier la question, en supprimant les non-parties importantes.
OriginalL'auteur Nojas | 2013-05-02
Vous devez vous connecter pour publier un commentaire.
N'oubliez pas le
<<<
dans votre expression, vous n'êtes pas en utilisant la commande grep avec un fichier, mais une chaîne de caractères. Pour être plus conforme à POSIX, vous pouvez également utiliser:Mais il est un peu laid.
Modifier:
Plus exemple:
Aussi, ce n'est pas directement lié à la question, mais vous voudrez peut-être avoir un coup d'oeil à Yad, qui fait les mêmes choses Zenity n', mais a plus d'options. Je l'ai utilisé beaucoup quand j'ai eu à écrire des scripts Bash, et l'a trouvé beaucoup plus utile que Zenity.
Je suppose que vous voulez que cela:
grep -E '(^0$|^[1-9][0-9]*[km]$)'
Il n'a pas de travail ni 0, ni pour le reste du motif.
OriginalL'auteur michaelmeyer
Vous ne voulez pas l'arrière-devis dans la
until
ligne. Vous pourriez écrire:Ou vous pouvez ajouter des arguments à
grep
pour éviter la sortie (ou d'envoyer la sortie à/dev/null
). Comme l'écrit, le script tente d'exécuter la sortie de lagrep
de commande et utilisez le succès ou l'échec d'état (pas legrep
en soi) comme une indication de l'opportunité de poursuivre la boucle ou pas.En outre, votre patron a besoin de quelques travaux. Il est:
Il est d'une incomparable parenthèse ouverte en. Aussi il me semble que si il essaie de permettre à un zéro. Vous voulez probablement:
Guillemets simples sont généralement plus sûrs que les guillemets doubles pour des choses comme des expressions régulières.
Dans
bash
, vous pouvez utiliser le<<<
opérateur de redirection à partir d'une chaîne de caractères:Dans la plupart des autres shells, vous devez écrire:
Cela fonctionne aussi dans
bash
, bien sûr.OriginalL'auteur Jonathan Leffler