2012-11-14 13 views
19

Sono bloccato cercando di incrementare una variabile in un file .xml. Il tag potrebbe essere in un file 100 volte o solo due volte. Sto cercando di aggiungere un valore che incrementerà l'importo più volte. Ho incluso un codice di esempio su cui sto lavorando, ma quando eseguo lo script ne inserirà solo uno e non incrementerà ulteriormente. Il consiglio sarebbe fantastico su quello che sto facendo male.Incremento con 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 

Il while ciclo è stato qualcosa che ho appena messo a testare il codice. Inserirà lo <process> ma non inserirà l'incremento.

Il mio obiettivo finale:

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

E così via finché <process> è presente nel file di cui ha bisogno per incrementare.

risposta

19

Per un corretto incremento bash, utilizzare un ciclo for (stile C):

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

USCITA

<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> 

NOTA

expr è un programma usato nell'antico codice shell per fare matematica. Nelle shell Posix come bash, usa $ ((espressione)). In bash e ksh93, è anche possibile utilizzare ((expression)) o let expression se non è necessario utilizzare il risultato in un'espansione.

EDIT

Se ho frainteso le vostre esigenze e si dispone di un file con valori vuoti in questo modo:

<process>value=""</process> 

provare questo:

$ 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 interruttore modificare il file per vero, quindi abbi cura di te.

+0

Vedere un test: http://pastie.org/5395937 –

32

Ho appena testato il codice e sembra incrementare correttamente i.

Si potrebbe provare a cambiare la sintassi incremento da:

i=`expr $i + 1` 

Per

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

o semplicemente '((i ++))'. Buona fortuna a tutti. – shellter

+1

né lavoro. Ora stampa in file .xml value = "10" per tutto e non incrementa –

+0

@CuriousGeorge: se ottieni sempre 10, quindi: A. dove viene impostato su tale valore (O sono in qualche modo i valori da 0-9 vengono scartati o saltati), B. come può anche stampare che quando si ha una condizione che 'i -lt 10'," i lessThan 10 "(Forse dovresti provare' ((i ++ <10)) '? Impara ad attivare la funzione di debug/trace della shell con' set -vx' nella parte superiore e 'set + vx' per disattivare la traccia. Questo mostrerà la linea (o il blocco) del codice che verrà eseguito, e poi ogni passo eseguito con valori sostituiti per le variabili: buona fortuna – shellter

1

Uso awk:

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

Questo sostituirà la stringa value="" con value="1", value="2", ecc . Tu può facilmente cambiare il valore iniziale e l'incremento (ad es ..."value=" i); i+=5; print)

9

Questo è il modo più semplice per incrementare una variabile in bash:

i=0 
((i++))