2016-04-04 8 views
0

Ich versuche, ein Shell-Skript zu schreiben, um eine Build-Nummer einer in einer JSON-Datei gespeicherten Version zu erhöhen.Update-Versionsnummer in JSON-Datei gespeichert

{ 
    /** 
    * The application's namespace. 
    */ 
    "name": "AppName", 

    /** 
    * The version of the application. 
    */ 
    "version": "1.0.0.23", 

    /** 
    * More comments..... 
    */ 
    .... 
} 

Ich habe getestet bereits eine einfache Möglichkeit, die Anzahl, wenn die Variable war bereits in der Datei zu erhöhen:

version='1.0.0.23' 
a=(${version//./ })     # replace points, split into array 
((a[3]++))        # increment revision (or other part) 
version="${a[0]}.${a[1]}.${a[2]}.${a[3]}"  # compose new version 
echo $version         # outputs: 1.0.0.24 

Ich habe sah jq und jshon aber weder wird analysieren, um die JSON-Datei weil es Kommentare enthält (die app.json Datei wird automatisch von Sencha Cmd generiert)

Wie kann ich die Versionseigenschaft mit etwas wie awk/sed lesen und aktualisieren? Wäre Jsawk besser?

aktualisieren Ich habe es geschafft, die Versionsnummer mit diesem zu extrahieren: version=$(sed -n 's/.*"version": "\(.*\)",/\1/p' app2.json) so jetzt kann ich die Version lesen und es zu erhöhen. Ich muss es jetzt einfach zurückschreiben.

+1

Gibt es keine Möglichkeit, die Kommentare wegzulassen? Ich kann nicht glauben, dass ein Tool '* .json'-Dateien erzeugt, die kein gültiger json sind. – hek2mgl

+0

scheint der Sencha-Standard zu sein: https://docs.sencha.com/cmd/6.x/microloader.html –

+0

Hmm, ich habe keine Ahnung von Sencha. Ich habe das Tag sencha hinzugefügt. Es ist wahrscheinlicher, dass Sie jemanden finden, der es dann weiß. – hek2mgl

Antwort

1

Mit awk:

awk -F'["]' -v OFS='"' '/"version":/{ 
    split($4,a,"."); 
    $4=a[1]"."a[2]"."a[3]"."a[4]+1 
    } 
;1' app.json 

mit IFS und OFS als " Fund Linie, die "version": übereinstimmt.

split($4,a,"."): split das vierte Feld mit . als Trennzeichen und Speichern in Array a.

$4=a[1]"."a[2]"."a[3]"."a[4]+1: Den $4 mit einem neuen Wert neu zuweisen.

1: print all Linien

Wenn Eingangsleitung ist "version": "1.0.0.23",

O/P "version": "1.0.0.24",

+0

Würde ich die Datei dann in awk pipen? z.B. 'Katze app.json | awk .... ' –

+0

Datei am Ende des Befehls awk angeben. Vermeiden Sie [nutzlose Verwendung der Katze] (https://en.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat). – 7171u

0

sein wird mich mit sed weiter experimentiert und es geschaffen, dies zu produzieren:

# get the existing version number 
ver=$(sed -n 's/.*"version": "\(.*\)",/\1/p' app2.json) # ver='1.0.0.43' 
echo "Current version: $ver" 

a=(${ver//./ })       # replace points, split into array 
((a[3]++))         # increment revision (or other part) 
newVer="${a[0]}.${a[1]}.${a[2]}.${a[3]}" # compose new version 
echo "New version: $newVer"     # newVer='1.0.0.44' 

# write output 
sed -i .temp "s/\"version\": \"$ver\"/\"version\": \"$newVer\"/g" app2.json 

was macht die Arbeit.