我试图在.xml文件中增加变量。标签可能出现在文件中 100 次或仅两次。我正在尝试添加一个值,该值将使金额增加数倍。我已经包含了一些我正在处理的示例代码,但是当我运行脚本时,它只会放置一个,而不会进一步递增。关于我做错了什么的建议会很棒。
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>
,它就需要递增。
我刚刚测试了您的代码,它似乎正确地增加了i
.
您可以尝试从以下位置更改增量语法:
i=`expr $i + 1`
自
i=$((i+1))
为了在bash
中正确增加,请使用 for 循环(C 样式):
n=10
for ((i=1; i<=n; i++)) {
printf '<process>value="%d"</process>n' $i
}
输出
<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
是古代 shell 代码中用于进行数学运算的程序。在像 bash 这样的 Posix shell 中,使用 $(( 表达式 ))。在 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
切换真正编辑文件,所以要小心。
这是在 bash 中递增变量的最简单方法:
i=0
((++i))
这也有效。
将变量声明为整数。
declare -i i=0
然后稍后您可以像这样递增:
i+=1
使用 awk
:
awk '{gsub( "value=""", "value=" i++ ); print }' i=1 input-file
这将用value="1"
、value="2"
等替换字符串value=""
。 您可以轻松更改起始值和增量(例如..."value=" i ); i+=5; print
)