2012-11-14 13 views
19

Utknąłem próbując zwiększyć zmienną w pliku .xml. Tag może znajdować się w pliku 100 razy lub tylko dwa razy. Próbuję dodać wartość, która zwiększy kwotę kilka razy. Załączam pewien przykładowy kod, nad którym pracuję, ale kiedy uruchomię skrypt, będzie on umieszczał tylko jeden i nie zwiększał dalej. Porada byłaby świetna w tym, co robię źle.Przyrost z bashem

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 

Pętla while było coś po prostu umieszczone przetestować kod. Wstawi on <process>, ale nie wstawi inkrementu.

Mój końcowy cel:

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

I tak dalej, dopóki <process> jest obecny w pliku potrzebuje do przyrostu.

Odpowiedz

19

do prawidłowego przyrostu bash użyć pętli for (C stylu):

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> 

UWAGA

expr to program używany w starożytnym kodzie powłoki do robienia matematyki. W powłokach Posix, takich jak bash, użyj $ ((wyrażenie)). W bash i ksh93 można również użyć ((expression)) lub let expression, jeśli nie trzeba używać wyniku w rozszerzeniu.

EDIT

Gdybym zrozumiał swoje potrzeby i masz plik z pustymi wartościami takiego:

<process>value=""</process> 

Spróbuj tego:

$ 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 przełącznik edytować plik za prawdziwe, więc uważaj.

+0

Zobacz test: http://pastie.org/5395937 –

32

Właśnie przetestowałem twój kod i wydaje się, że poprawnie wzrasta i.

Można spróbować zmienić swoją składnię przyrost od:

i=`expr $i + 1` 

Aby

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

lub po prostu '((i ++))'. Powodzenia wszystkim. – shellter

+1

żadnej pracy. Teraz drukuje do pliku .xml wartość = "10" dla wszystkiego i nie zwiększa –

+0

@CuriousGeorge: jeśli zawsze dostajesz 10, to: A. gdzie jest to ustawianie tej wartości (LUB są w jakiś sposób wartościami od 0-9 są odrzucane lub pomijane), B. jak to może być drukowane, gdy masz warunek, że 'i -lt 10'," i lessThan 10 "(Może powinieneś spróbować' ((i ++ <10)) '? Naucz się włączać funkcję debugowania/śledzenia powłoki za pomocą' set -vx' w górnej części i 'set + vx', aby wyłączyć śledzenie, co wyświetli wiersz (lub blok) kodu, który zostanie wykonany, a następnie każdy wykonany krok z wartościami podstawionymi dla zmiennych .. Powodzenia – shellter

1

użytkowania awk:

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

To zastąpi ciąg value="" z value="1", value="2", etc . Ty może łatwo zmienić wartość początkową i skok (np ..."value=" i); i+=5; print)

9

Jest to najprostszy sposób, aby zwiększyć wartość zmiennej w bashu:

i=0 
((i++))