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.

2
citizen 21 avril 2017 à 01:37

3 réponses

Meilleure réponse

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

Démo et explication de Regex

2
CONvid19 20 avril 2017 à 23:35

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
1
codeforester 21 avril 2017 à 05:40

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
0
grail 23 avril 2017 à 10:31