2017-10-09 3 views
0

Aidez-moi à comprendre la syntaxe sed.I a supprimé les guillemets simples, mais le code ne fonctionne toujours pas.Commande Sed dans le script TCL

set id [open file.txt] 
# send the request, get a lot of data 
set tok [::http::geturl "http://example.com"-channel $id] 
# cut out the necessary data between two words 
exec sed s/{"data1":\(.*\)/data2\1/ $id 
close $id 
set ir [open file.txt] 
set phone [read $ir] 
close $ir 
puts $phone 

Le problème est que je reçois des données à partir d'une requête de ce qui suit genre

{"id":3876,"form":"index","time":21,"data":"2529423","service":"Atere","response":"WAIT"} 

L'accolade est un élément de la syntaxe de la langue, et je dois couper exactement la valeur entre la mot et l'orthèse. Comment implémenter ceci dans un script.

+0

44 Q/Comme lors de la recherche ici pour 'utiliser sed [tcl]'. Certains ont l'air très prometteur. Il est également préférable de mettre à jour votre Q pour afficher la sortie requise. Bonne chance. – shellter

Répondre

1

Votre code est plutôt confus, car (a) vous passez un handle de fichier à la commande sed. Ça ne va pas marcher. (b) vous passez un canal d'entrée à http plutôt qu'à un canal de sortie (essayez d'ouvrir le fichier pour l'écrire).

À propos du problème sous-jacent. Si vous recevez des données JSON de base comme indiqué.

a) Vous pouvez utiliser un analyseur de JSON: tcllib's json module

b) Convertir à une forme qui Tcl peut analyser comme un dictionnaire

# Assuming the JSON data is in the $data variable, and there's no 
# other data present. This also assumes the data is very basic 
# there are no embedded commas. Many assumptions means this 
# code is likely to break in the future. A JSON parser would 
# be a better choice. 
set data "\{" 
append data {"id":3876,"form":"index","time":21,"data":"2529423","service":"Atere","response":"WAIT"} 
append data "\}" 
regsub -all {[{}:",]} $data { } data 
set mydatadict $data 
puts [dict get $mydatadict id] 

Edit:

Pour le traitement de http :

set tok [::http::geturl "http://example.com"] 
set data [::http::data $tok] 
::http::cleanup $tok 
+0

Oui, sur une autre ressource, on m'a également indiqué ceci. Merci d'avoir répondu. Et comment puis-je ajouter du texte au dictionnaire à partir du fichier? Ou est-il préférable de directement à partir de la requête http? – Lefeofan

+0

Merci beaucoup! Je l'ai fait selon vos conseils et tout a fonctionné. – Lefeofan

+0

Une alternative possible qui n'ajoute pas beaucoup de blancs parasites: 'set data [regexp -all -inline {[^" {}:,] +} $ data] '. Les espaces ne dérangent pas le' dict' Commandes, bien sûr Notez que plus d'intelligence est nécessaire si les clés ou les valeurs ont des blancs –