1
`<?xml version="1.0" encoding="UTF-8"?>
<StudentInfo Version="1">
<Student>
<StudentId>INS469</StudentId>
<ClassId>21</ClassId>
<Amount>100</Amount>
<Location>AA</Location>
</Student>'
'<?xml version="1.0" encoding="UTF-8"?>
<StudentInfo Version="1">
<Student>
<StudentId>INS469</StudentId>
<ClassId>21</ClassId>
<Amount>100</Amount>
<Location>AA</Location>
</Student>'
'<?xml version="1.0" encoding="UTF-8"?>
<StudentInfo Version="1">
<Student>
<StudentId>INS469</StudentId>
<ClassId>21</ClassId>
<Amount>100</Amount>
<Location>AA</Location>
</Student>`

在这里,我想使用 shell 脚本更改 Amount 的值,并且我只想要唯一的值。我怎样才能做到这一点 。请建议。

4

2 回答 2

1
[sgeorge@sgeorge-ld staCK]$ cat xml 
<?xml version="1.0" encoding="UTF-8"?>
<StudentInfo Version="1">
<Student>
<StudentId>INS469</StudentId>
<ClassId>21</ClassId>
<Amount>100</Amount>
<Location>AA</Location>
</Student>'
'<?xml version="1.0" encoding="UTF-8"?>
<StudentInfo Version="1">
<Student>
<StudentId>INS469</StudentId>
<ClassId>21</ClassId>
<Amount>100</Amount>
<Location>AA</Location>
</Student>'
'<?xml version="1.0" encoding="UTF-8"?>
<StudentInfo Version="1">
<Student>
<StudentId>INS469</StudentId>
<ClassId>21</ClassId>
<Amount>100</Amount>
<Location>AA</Location>
</Student>

[sgeorge@sgeorge-ld staCK]$ OLDIFS=$IFS; IFS=$'\n'; COUNT=1; for i in `cat xml` ; do echo $i | sed "s/<Amount>.*<\/Amount>/<Amount>"$COUNT"<\/Amount>/g" && ((COUNT++))  ; done ; IFS=$OLDIFS
<?xml version="1.0" encoding="UTF-8"?>
<StudentInfo Version="1">
<Student>
<StudentId>INS469</StudentId>
<ClassId>21</ClassId>
<Amount>6</Amount>
<Location>AA</Location>
</Student>'
'<?xml version="1.0" encoding="UTF-8"?>
<StudentInfo Version="1">
<Student>
<StudentId>INS469</StudentId>
<ClassId>21</ClassId>
<Amount>14</Amount>
<Location>AA</Location>
</Student>'
'<?xml version="1.0" encoding="UTF-8"?>
<StudentInfo Version="1">
<Student>
<StudentId>INS469</StudentId>
<ClassId>21</ClassId>
<Amount>22</Amount>
<Location>AA</Location>
</Student>

或者(如果你想要一个真正的自定义值)做如下:

[sgeorge@sgeorge-ld staCK]$ cat amount.txt 
121213424525
1213125435
1313145357460
988783784332
82990190231932

[sgeorge@sgeorge-ld staCK]$ OLDIFS=$IFS; IFS=$'\n'; COUNT=1; for i in `cat xml` ; do echo $i | grep '<Amount>' >/dev/null && AMT=$(tail -1 amount.txt) && sed -i "/^$AMT$/d" amount.txt && echo $i | sed "s/<Amount>.*<\/Amount>/<Amount>"$AMT"<\/Amount>/g" || echo $i ; done ;  IFS=$OLDIFS
<?xml version="1.0" encoding="UTF-8"?>
<StudentInfo Version="1">
<Student>
<StudentId>INS469</StudentId>
<ClassId>21</ClassId>
<Amount>82990190231932</Amount>
<Location>AA</Location>
</Student>'
'<?xml version="1.0" encoding="UTF-8"?>
<StudentInfo Version="1">
<Student>
<StudentId>INS469</StudentId>
<ClassId>21</ClassId>
<Amount>988783784332</Amount>
<Location>AA</Location>
</Student>'
'<?xml version="1.0" encoding="UTF-8"?>
<StudentInfo Version="1">
<Student>
<StudentId>INS469</StudentId>
<ClassId>21</ClassId>
<Amount>1313145357460</Amount>
<Location>AA</Location>
</Student>

编辑

OLDIFS=$IFS; IFS=$'\n'; COUNT=1; for i in `cat xml` ; do echo $i | grep '<Amount>' >/dev/null && AMT=$(tail -1 amount.txt) && sed -i "/^$AMT$/d" amount.txt && echo $i | sed "s/<Amount>.*<\/Amount>/<Amount>"$AMT"<\/Amount>/g" || echo $i ; done > /tmp/xml_output.xml;  IFS=$OLDIFS
于 2013-01-12T06:31:10.197 回答
1

假设“...”标签位于一行,您可以使用以下 awk 单行(要更改的 xml 文本存储在“文件”中):

awk -v AMOUNT=1 '/<Amount>.*<\/Amount>/ { print "<Amount>" AMOUNT++ "</Amount>" ; next } ; { print }' file

要从“amounts_file.txt”中读取值:

awk -v AMOUNT_FILE="amounts_file.txt" '/<Amount>.*<\/Amount>/ { getline AMOUNT < AMOUNT_FILE ; print "<Amount>" AMOUNT++ "</Amount>" ; next } ; { print }' file

金额文件结束后,金额的值将从文件的最后一个值递增。

于 2013-01-12T07:57:58.003 回答