2016-04-26 15 views
3

Ich habe die Aufgabe, eine Konfigurationsdatei zu erstellen. Die Konfigurationsdatei ist eine JSON-Datei. Beispiel untenSuchen Sie ein Wort und ersetzen Sie es durch Wörter aus der Datei

"text": { 
     "data": "Click Here", 
     "size": 36, 
     "style": "bold", 
     "name": "text1", 
     "hOffset": 250, 
     "vOffset": 100, 
     "alignment": "center", 
     "onMouseUp": "sun1.opacity = (sun1.opacity/100) * 90;" 
    } 

Die Konfiguration wiederholt mit der Änderung des „Stil“ Attribute des json. Also werde ich den obigen Text 50 Mal kopieren. Ich möchte dann das "Stil" -Attribut durch verschiedene Stile ersetzen, die von einer anderen kommagetrennten Datei eingegeben wurden, wie unten gezeigt.

bold,italic,cryptic 

würde Der Ausgang

"text": { 
      "data": "Click Here", 
      "size": 36, 
      "style": "bold", 
      "name": "text1", 
      "hOffset": 250, 
      "vOffset": 100, 
      "alignment": "center", 
      "onMouseUp": "sun1.opacity = (sun1.opacity/100) * 90;" 
     } 
"text": { 
      "data": "Click Here", 
      "size": 36, 
      "style": "italic", 
      "name": "text1", 
      "hOffset": 250, 
      "vOffset": 100, 
      "alignment": "center", 
      "onMouseUp": "sun1.opacity = (sun1.opacity/100) * 90;" 
     } 
"text": { 
      "data": "Click Here", 
      "size": 36, 
      "style": "cryptic", 
      "name": "text1", 
      "hOffset": 250, 
      "vOffset": 100, 
      "alignment": "center", 
      "onMouseUp": "sun1.opacity = (sun1.opacity/100) * 90;" 
     } 

Gibt es einen einfacheren Weg, dies zu tun sein, dann?

Antwort

4

Eine andere Lösung mit GNU awk für gensub:

awk -v RS= ' 
    NR==FNR { n = split($0, styles, /,/); next } 
    { 
    for (i=1; i<=n; i++) { 
     style = "\"" styles[i] "\"" 
     print gensub (/(["]style["]:).[^,]+/, "\\1" style, "G", $0); 
    } 
    } 
' style.txt config.file 

Sie beginnen mit einer Datei namens style.txt ab, die getrennte Werte von Arten Komma hat Sie wollen. Sie speichern sie in einem Array. Sie fahren fort, Ihre Config-Datei zu iterieren und das Style-Segment auszutauschen und durch ein neues Pattern zu ersetzen.

Ich hasse zugeben, dass JSONs besser mit einem JSON-Parser mit Perl, Ruby oder Python geparst werden können, aber dies als eine einmalige Option, da Sie keine Kontrolle über die Konfigurationsdatei haben.

0

Ich bin mir nicht sicher, in was Sie es anwenden möchten, aber Sie könnten den JSON für jede Iteration gleich lesen und innerhalb dieser Iteration den Wert von Style ändern, wo Sie müssen. Nur eine Idee.

+0

Das Lesen von Json ist außerhalb meiner Kontrolle. Ich stelle nur die Konfigurationsdatei zur Verfügung. Also ich bin verpflichtet, es in der Datei zu tun –

+0

Wenn Sie nur die JSON-Datei ändern können, dann glaube ich nicht, dass es viel gibt, was Sie tun können. Warte, ob jemand anders einen Weg kennt. Wenn Sie Zugriff auf die Datei außerhalb der Datei (im Code) hatten, können Sie einfach das Put-Verfahren verwenden. JSON-Objekt date = jsonArray.getJSONObject (0) .getJSONObject ("Tag"); person.put ("Tag", "Dienstag"); –

3

awk zur Rettung!

$ awk -v RS= 'NR==FNR{t=$0;next} 
        {n=split($0,styles,","); 
         for(i=1;i<=n;i++) {s=t; 
             sub("bold",styles[i],s); 
             print s 
             } 
        }' template styles 

wo Vorlage der JSON formatierte Text und Stile ist eine durch Komma getrennte Datei (eine oder mehrere Zeilen). Angenommen, "fett" erscheint nur einmal in der Vorlage.