je ne suis pas sure de la sortie voulu, mais peut-être ce sed :
En gardant les guillemets, sinon ça ne fonctionnera pas car je cherche une quote.Code:sed "s/.*\(0x[^']*\)[^0-9]*\([0123456789\.e+]*\).*/\1:\2/;t;d" fichier
Version imprimable
je ne suis pas sure de la sortie voulu, mais peut-être ce sed :
En gardant les guillemets, sinon ça ne fonctionnera pas car je cherche une quote.Code:sed "s/.*\(0x[^']*\)[^0-9]*\([0123456789\.e+]*\).*/\1:\2/;t;d" fichier
ok.
et, quelle est cette commande ?
t-> si le s/.../.../ qui précède est vrai on va à la fin de la sequence pour passer à une prochaine ligne, donc le d n'est pas exécuté et donc si le substitue n'est pas fait, le d se fait.
curieux.
si il n'y a pas de correspondance avec le motif dans la partie gauche, le p n'est pas exécuté !
:chin:
Cadeau:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 $ cat /tmp/bob.txt { candidates: { '0x02683507aF2C6b07421D1eA96594D7b87198e4AB': { capacity: 3.9065102e+23, status: 'OK' }, '0x0294FFDE40972F8E5902aA855ecF967c04DEDD82': { capacity: 3.916795e+22, status: 'KO' }, '0x05B6D0B939EA98ad3B34a44dFEc000821Fc14158': { capacity: 3.3262529e+23, status: 'OK' }, '0x085D3799e83aaD45693ca8F04cb5638E3DB8558C': { capacity: 4.8971009e+22, status: 'OK' }, '0x0a1d951199bBa5420759BF02Cf851F9cb9e0A3b6': { capacity: 3.9167e+22, status: 'OK' }, '0x0a4cc174dc6678213B0Eb2AD9713e4f5acda81A5': { capacity: 3.155669e+23, status: 'KO' }, '0x0a8eDC641eDF73887C1E6D13F22fdb6BA5ACeBb8': { capacity: 3.680685e+22, status: 'KO' }, '0x0b66B71B8f0D8Fd331385c5EB67E8cAbD54b4a60': { capacity: 5.7125219e+22, status: 'OK' }, '0x101fD3E0aCd802D7821B4a88a7DA96E1D2a85e17': { capacity: 3.341486e+23, status: 'OK' }, '0x102f1c7129dAeDE2e5f60D8E1B7a6246f0Ca59af': { capacity: 2.7396e+22, status: 'OK' } }, epoch: 29086, success: true }
Code:
1
2 $ gawk -F[\':,] -vppp=0x085D3799e83aaD45693ca8F04cb5638E3DB8558C 'BEGIN{PROCINFO["sorted_in"]="@val_num_desc"}/0x/{xx[$2]=$5}END {j=1; for (i in xx){if (i==ppp) {print j,i,xx[i]}j++}}' /tmp/bob.txt 6 0x085D3799e83aaD45693ca8F04cb5638E3DB8558C 4.8971009e+22
Ta commande retouchée un peu par N_BaH peut également être raccourcie encore un peu au niveau du 2ème groupe :
J'ai vu également que \d est l'abréviation de la classe de caractères [0-9]Code:sed -n "s/.*\(0x[^']*\)[^0-9]*\([0-9\.e+]*\).*/\1:\2/p"
et que \D est l'abréviation de la classe de caractères [^0-9]
mais je n'ai pas réussi à les intégrer dans ta commande...
Voici après avoir travailler ma leçon :D, la traduction en français de la commande sed suivante:
Ligne à nettoyer (monfichier.txt) :Code:sed -n "s/.*\(0x[^']*\)[^0-9]*\([0-9\.e+]*\).*/\1:\2/p" monfichier.txt
{ candidates:
{ ...
'0xfeE74c87cEc6e4851b11Ec4B4E7Ff4A54cC982f3': { capacity: 3.834303e+22, status: 'SLASHED' },
... },
epoch: 29086,
success: true }
-n : on ne restitue pas le résultat du contenu du fichier avec les modifications, pour afficher seulement les lignes modifiées (p) afin de ne pas prendre en compte les éléments superflus du fichier («*{ candidates:*», «*epoch: 29086,*» et «*success: true }*»
s : on substitue une ligne du fichier par la sélection des groupes 1 et 2
[regex] : Définition de la ligne à nettoyer en regex
.* : N’importe quel nombre de n’importe quel caractère ( ')
\ : Caractère d’échappement
( ) : Définition du 1er groupe de caractères à extraire (0xfeE74c87cEc6e4851b11Ec4B4E7Ff4A54cC982f3)
0x[^']* : 0x suivit de n’importe quel nombre d’un caractère quelconque sauf « ‘ » (0xfeE74c87cEc6e4851b11Ec4B4E7Ff4A54cC982f3)
[^0-9]* : N’importe quel nombre d’un caractère quelconque sauf « 0-9 » (': { capacity: )
( ) : Définition du 2ème groupe de caractères à extraire (3.834303e+22)
[0-9\.e+]* : N’importe quel nombre d’un caractère au choix parmi ceux de la classe (3.834303e+22)
.* : N’importe quel nombre de n’importe quel caractère (, status: 'SLASHED' },)
\1:\2 : Substituant composé des groupes 1 et 2, séparés par “:”
p : Affiche les lignes modifiées
je voudrais quand même revenir aux origines du fichier, à la commande qui le génère, pour , si possible (peut-être en modifiant la-dite commande*), donner une solution adaptée.
--
* j'ai lu, en cherchant des infos pour corriger ce que je croyais être du JSON, qu'en fait il s'agirait de javascript...