我有一个XML文件,其中包含一系列组,例如
<Group id="CB1391262521L-10816-1390650339-936236343" name="This Speed" color="#FFFFFF">
<Topology>
<TopologyRect cylinderHor="false" hcount="1" cylinderVert="false" vcount="1"/>
</Topology>
<Name="test">
<Parameter value="1" name="ssd"/>
<Parameter value="1" name="amp"/>
</Name>
<Note></Note>
<DiagramIcon width="50" x="89" y="392" height="50"/>
</Group>
<Group id="L-14827-1391619839-708665346" name="Angle" color="#FFFFFF">
<Topology>
<TopologyRect cylinderHor="false" hcount="1" cylinderVert="false" vcount="2"/>
</Topology>
<Name="test">
<Parameter value="3" name="ssd"/>
<Parameter value="2" name="amp"/>
</Name>
<Note></Note>
<DiagramIcon width="50" x="89" y="392" height="50"/>
</Group>
和连接,例如
<Connection target="CB1391262521L-10816-1390650339-936236343" type="excitatory" id="L-22494-1391265621-2060625361-1" source="L-14827-1391619839-708665346" name="Connection Reflex->M">
<Pattern></Pattern>
</Connection>
我想制作一个 unix shell 脚本(例如使用 grep),该脚本复制此文件 N 次,但对于创建的每个副本,将字符串 -01、-02 等(取决于 N)附加到 XML 文件中任何标签的id
、target
和source
属性中包含的所有值(组, 连接等)。脚本应具有原始.xml文件和所需副本数作为参数,例如
myScript.py OriginalFile.xml 5
其中 5 是副本数,脚本的输出生成 5 个.xml文件,其中第一个文件在 id、目标和源属性中包含的所有值后附加了 -01,第二个文件将有 -02 等...
我认为这是一个正则表达式搜索和替换,不需要在 Python 中解析原始 XML 文件,而只需将其作为普通文本文件逐行读取即可。
纯壳
#!/usr/bin/env bash
xml=$1
n=$2
for i in $(seq $n)
do
i=$(printf "%02s" $i)
sed -r "s/((id|target|source)="[^"]+[0-9])/1-$i/g" $xml > $i.xml
done
如何运行
myScript.sh OriginalFile.xml 5
然后你会得到5个XML文件:01.xml, 02.xml, etc.
Python 解决方案:
import re
n=5
with open("source.xml","r") as source:
xml = source.read()
for i in range(n):
with open("out-%d.xml" % i,"w") as target:
modxml = re.sub(r'(id|target|source)="([^"]*)"',r'1="2-%d"' % i,xml)
target.write(modxml)