Подтвердить что ты не робот

Приращение с помощью bash

Я застреваю, пытаясь увеличивать переменную в XML файле. Тег может быть в файле 100 раз или дважды. Я пытаюсь добавить значение, которое будет увеличивать количество несколько раз. Я включил некоторый пример кода, над которым я работаю, но когда я запускаю script, он будет помещать только один, а не увеличивать. Совет будет отличным в том, что я делаю неправильно.

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 был чем-то, что я только что поставил, чтобы проверить код. Он будет вставлять <process>, но он не будет вставлять приращение.

Моя конечная цель:

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

И так далее, пока <process> присутствует в файле, он должен увеличиваться.

4b9b3361

Ответ 1

Для правильного приращения в bash используйте цикл for (стиль C):

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>

Примечание

expr - это программа, используемая в древнем коде оболочки для выполнения математики. В оболочках Posix, например bash, используйте $((выражение)). В bash и ksh93 вы также можете использовать (( expression )) или let expression, если вам не нужно использовать результат в расширении.

ИЗМЕНИТЬ

Если я неправильно понял ваши потребности, и у вас есть файл с пустыми значениями, например:

<process>value=""</process>

попробуйте следующее:

$ 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 переключить редактирование файла на самом деле, поэтому будьте осторожны.

Ответ 2

Я просто проверил ваш код и, кажется, правильно увеличил i.

Вы можете попробовать изменить синтаксис приращения:

i=`expr $i + 1`

Для

i=$((i+1))

Ответ 3

Это самый простой способ увеличения переменной в bash:

i=0
((i++))

Ответ 4

Используйте awk:

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

Это заменит строку value="" на value="1", value="2" и т.д. Вы можете легко изменить начальное значение и приращение (например, ..."value=" i ); i+=5; print)

Ответ 5

Это тоже работает.

Объявление переменной как целого числа.

declare -i i=0

Затем позже вы можете увеличивать следующим образом:

i+=1