Incrément avec bash

je suis coincé à essayer d'incrémenter une variable dans un .fichier xml. La balise peut être dans un fichier de 100 fois ou deux. J'essaie d'ajouter une valeur qui augmentera la quantité plusieurs fois. J'ai inclus un exemple de code sur lequel je travaille, mais quand j'exécute le script, il n'en placera qu'un et n'incrémentera pas plus. Conseils serait génial sur ce que je fais mal.

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

while loop est quelque chose que je viens de placer pour tester le code. Il va insérer le <process> mais il ne pas insérer l'incrément.

Mon objectif final:

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

Et ainsi de suite tant que <process> est présent dans le fichier qu'il doit incrémenter.

19
demandé sur dda 2012-11-14 23:50:01

4 réponses

pour un incrément approprié dans bash, utiliser une boucle for (type C) :

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

sortie

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

NOTE

expr est un programme utilisé dans le code shell antique pour faire des maths. Dans les shells Posix comme bash, utilisez $ ((expression )). En bash et ksh93, vous pouvez aussi utiliser (( expression )) ou let expression si vous n'avez pas besoin d'utiliser le résultat d'une extension.

EDIT

Si j'ai mal compris votre besoins et que vous avez un fichier avec des valeurs vides comme ceci :

<process>value=""</process>

essaye ceci :

$ 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 switch éditez le fichier pour de vrai, alors faites attention.

19
répondu Gilles Quenot 2012-11-18 11:09:13

je viens de tester votre code et il semble bien incrémenter i.

Vous pouvez essayer de changer votre incrément de syntaxe:

i=`expr $i + 1`

i=$((i+1))
32
répondu sampson-chen 2012-11-14 19:54:04

C'est la façon la plus simple d'incrémenter une variable dans bash:

i=0
((i++))
10
répondu Cory Klein 2014-08-01 17:59:42

Utiliser awk:

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

ceci remplacera la chaîne value=""value="1",value="2", etc. Vous pouvez facilement changer la valeur de départ et l'incrément ( par exemple ..."value=" i ); i+=5; print )

1
répondu William Pursell 2012-11-14 20:22:11