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

ここでは、シェル スクリプトを使用して Amount の値を変更したいのですが、一意の値のみが必要です。どうやってやるの 。提案してください。

4

2 に答える 2

1

「...」タグが 1 行にある場合は、次の awk ワンライナーを使用できます (変更する xml テキストは「file」に保存されます)。

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

amount ファイルの終了後、Amount の値はファイルの最後の値からインクリメントされます。

于 2013-01-12T07:57:58.003 に答える
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>

または (Amount に実際のカスタム値が必要な場合)、次のようにします。

[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 に答える