2012-11-14 21 views
19

Ich stecke fest, versucht, eine Variable in einer XML-Datei zu erhöhen. Das Tag kann 100 mal oder nur zweimal in einer Datei sein. Ich versuche, einen Wert hinzuzufügen, der den Betrag mehrmals erhöht. Ich habe einen Beispielcode eingefügt, an dem ich gerade arbeite, aber wenn ich das Skript ausführe, wird nur ein Eins gesetzt und nicht weiter erhöht. Ratschläge wären toll, was ich falsch mache.Inkrementieren mit Bash

for xmlfile in $(find $DIRECTORY -type f -name \*.xml); do 
    TFILE="/tmp/$directoryname.$$" 
    FROM='><process>' 
    TO=' value\=""><process>' 
    i=0 
    while [ $i -lt 10 ]; do 
    i=`expr $i + 1` 
    FROM='value\=""' 
    TO='value\="'$i'"' 
    done 
    sed "s/$FROM/$TO/g" "$xmlfile" > $TFILE && mv $TFILE "$xmlfile" 
done 

Die while Schleife war etwas, was ich den Code zu testen gerade gelegt. Es wird die <process> einfügen, aber es wird das Inkrement nicht einfügen.

Mein Endziel:

<process>value="1"</process> 
<process>value="2"</process> 
<process>value="3"</process> 
<process>value="4"</process> 

Und so weiter, solange <process> in der Datei vorhanden ist, es erhöhen muss.

Antwort

19

Für ein ordnungsgemäßes Inkrement in bash ändern, verwendet einen for-Schleife (C-Stil):

n=10 
for ((i=1; i<=n; i++)) { 
    printf '<process>value="%d"</process>\n' $i 
} 

OUTPUT

<process>value="1"</process> 
<process>value="2"</process> 
<process>value="3"</process> 
<process>value="4"</process> 
<process>value="5"</process> 
<process>value="6"</process> 
<process>value="7"</process> 
<process>value="8"</process> 
<process>value="9"</process> 
<process>value="10"</process> 

HINWEIS

expr ist ein Programm, das im alten Shell-Code zur Mathematik verwendet wird. Verwenden Sie in Posix-Shells wie bash $ ((Ausdruck)). In bash und ksh93 können Sie auch ((expression)) oder let expression verwenden, wenn Sie das Ergebnis nicht in einer Erweiterung verwenden müssen.

EDIT

Wenn ich Ihre Bedürfnisse verstanden und Sie haben eine Datei mit leeren Werten wie folgt aus:

<process>value=""</process> 

versuchen Sie dies:

$ perl -i -pe '$c++; s/<process>value=""/<process>value"$c"/g' file.xml 
<process>value"1"</process> 
<process>value"2"</process> 
<process>value"3"</process> 
<process>value"4"</process> 
<process>value"5"</process> 
<process>value"6"</process> 
<process>value"7"</process> 

-i Schalter bearbeiten Sie die Datei für echt, also pass gut auf.

+0

Sehen Sie sich einen Test an: http://pastie.org/5395937 –

32

Ich habe gerade Ihren Code getestet und scheint i korrekt zu erhöhen.

könnten Sie versuchen, aus dem Zuwachs Syntax zu ändern:

i=`expr $i + 1` 

Um

i=$((i+1)) 
+13

oder '((i ++))'. Viel Glück für jeden. – shellter

+1

funktionieren nicht. Nun druckt es auf .xml-Datei value = "10" für alles und nicht inkrement –

+0

@CuriousGeorge: wenn Sie immer 10 bekommen, dann: A. wo wird es auf diesen Wert gesetzt (ODER sind irgendwie die Werte von 0-9 werden verworfen oder übersprungen), B. wie kann es das sogar drucken, wenn du eine Bedingung hast, dass "ich - 10", "ich weniger als 10" (Vielleicht solltest du '((i ++ <10) versuchen) '' Lernen Sie, die Shell-Debugging-/Trace-Funktion mit 'set -vx' nahe dem oberen und' set + vx' einzuschalten, um den Trace auszuschalten. Dies zeigt Ihnen die Zeile (oder den Block) des Codes, der ausgeführt wird, und dann jeder Schritt ausgeführt mit Werten für die Variablen. Viel Glück – shellter

1

Verwendung awk:

awk '{gsub("value=\"\"", "value=" i++); print }' i=1 input-file 

Dies ersetzt die Zeichenfolge value="" mit value="1", value="2", etc . Sie kann leicht den Startwert und das Inkrement (zB ..."value=" i); i+=5; print)

9

Dies ist der einfachste Weg, um eine Variable in bash zu erhöhen:

i=0 
((i++))