Un fichier qui ressemble à ce qui suit est créé à partir d'un appel d'API.
{
"success" : true,
"messages" : [ "traces loaded successfully" ],
"traces" : [ "CRXJ-ZCKP-3XVD-4J36", "8C31-QMHZ-XVF0-ZV4Q", "40P7-MT6L-2YFP-5Q6Q", "JE7J-J4WQ-7GGL-2U8N", "10PW-AZ8M-FPTK-XWYL", "9YGF-5HOP-8GTY-9AF4", "SNXZ-GW6O-BTJT-3XUX" ]
}
Comment puis-je capturer chaque trace séparément? J'aurai besoin de les parcourir dans une étape ultérieure.
Ce qui suit ne renvoie rien à moins que je supprime les parenthèses. Ensuite, il donne simplement toute la ligne "traces".
grep "([A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4})"
La réponse doit pouvoir fonctionner sur toutes les machines Unix sans charger de bibliothèques.
3 réponses
Vous pouvez utiliser:
grep -oE '([A-Z0-9]+-?){4}' file
Options:
-o, --only-matching show only the part of a line matching PATTERN
-E, --extended-regexp PATTERN is an extended regular expression (ERE)
Production:
CRXJ-ZCKP-3XVD-4J36
8C31-QMHZ-XVF0-ZV4Q
40P7-MT6L-2YFP-5Q6Q
JE7J-J4WQ-7GGL-2U8N
10PW-AZ8M-FPTK-XWYL
9YGF-5HOP-8GTY-9AF4
SNXZ-GW6O-BTJT-3XUX
Utilisez grep -oE
:
grep -oE '[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}' file
Production:
CRXJ-ZCKP-3XVD-4J36
8C31-QMHZ-XVF0-ZV4Q
40P7-MT6L-2YFP-5Q6Q
JE7J-J4WQ-7GGL-2U8N
10PW-AZ8M-FPTK-XWYL
9YGF-5HOP-8GTY-9AF4
SNXZ-GW6O-BTJT-3XUX
Vous pouvez également rester en bash:
#!/usr/bin/env bash
regex='("(([[:alnum:]]{4}-?){4})"(, )?)+'
while read -r line
do
if [[ "$line" =~ $regex ]]
then
for trace in ${BASH_REMATCH[0]//[\",]/}
do
echo "do stuff with $trace"
done
fi
done<input_file
De nouvelles questions
regex
Les expressions régulières fournissent un langage déclaratif pour faire correspondre les modèles dans les chaînes. Ils sont couramment utilisés pour la validation, l'analyse et la transformation de chaînes. Étant donné que les expressions régulières ne sont pas entièrement standardisées, toutes les questions avec cette balise doivent également inclure une balise spécifiant le langage de programmation ou l'outil applicable.