Приращение с помощью 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>
присутствует в файле, он должен увеличиваться.
Ответы
Ответ 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