Ich habe eine XML-Datei aus mehreren Blöcken, die sehr ähnlich sind. Hier sind zwei:Tauschen Sie zwei Blöcke von Text programmatisch
<Grid Name="EMFieldMany" GridType="Uniform">
<Topology TopologyType="3DRectMesh" Dimensions="40 40 40 "/>
<Attribute AttributeType="Scalar" Name="Er" Center="Node">
<DataItem Dimensions="40 40 40 " NumberType="Float" Precision="8" Format="HDF5" Endian="Big">
Field_reflected_time_3D.hdf5:/field/Er-0
</DataItem>
</Attribute>
<Geometry GeometryType="VXVYVZ">
<DataItem Name="r" Dimensions="40" NumberType="Float" Precision="8" Format="HDF5" Endian="Big">
Field_reflected_time_3D.hdf5:/coordinates/r
</DataItem>
<DataItem Name="theta" Dimensions="40" NumberType="Float" Precision="8" Format="HDF5" Endian="Big">
Field_reflected_time_3D.hdf5:/coordinates/theta
</DataItem>
<DataItem Name="z" Dimensions="40" NumberType="Float" Precision="8" Format="HDF5" Endian="Big">
Field_reflected_time_3D.hdf5:/coordinates/z
</DataItem>
</Geometry>
</Grid>
<Grid Name="EMFieldMany" GridType="Uniform">
<Topology TopologyType="3DRectMesh" Dimensions="40 40 40 "/>
<Attribute AttributeType="Scalar" Name="Er" Center="Node">
<DataItem Dimensions="40 40 40 " NumberType="Float" Precision="8" Format="HDF5" Endian="Big">
Field_reflected_time_3D.hdf5:/field/Er-1
</DataItem>
</Attribute>
<Geometry GeometryType="VXVYVZ">
<DataItem Name="r" Dimensions="40" NumberType="Float" Precision="8" Format="HDF5" Endian="Big">
Field_reflected_time_3D.hdf5:/coordinates/r
</DataItem>
<DataItem Name="theta" Dimensions="40" NumberType="Float" Precision="8" Format="HDF5" Endian="Big">
Field_reflected_time_3D.hdf5:/coordinates/theta
</DataItem>
<DataItem Name="z" Dimensions="40" NumberType="Float" Precision="8" Format="HDF5" Endian="Big">
Field_reflected_time_3D.hdf5:/coordinates/z
</DataItem>
</Geometry>
</Grid>
Typischerweise ich Hunderte von ähnlichen <Grid>
Objekte in einer einzigen Datei. Nun möchte ich programmatisch die Positionen der und <DataItem Name="z">
Blöcke in jedem <Grid>
Objekt austauschen, so dass die <DataItem>
s in der Reihenfolge z, Theta, r sind. Für jede Dimensions=" x y z "
-Anweisung, jedes Dimensions
-Attribut, das drei Werte enthält, möchte ich, dass das Attribut als Dimensions=" z y x "
umgeschrieben wird.
Ich habe nicht wirklich etwas dagegen, die Programmiersprache verwendet wird, um dies zu tun. Ich bin auf einer Linux-Workstation mit Bash, Python, Perl ... all den Standard-Sachen.
EDIT: Diese answer verwendet sed
, um Blöcke von Text, aber ich bin mir nicht sicher, wie Sie den ausgewählten Block danach manipulieren. Diese other answer vertauscht einzelne Zeilen nach oben und unten, aber ich bin mir nicht sicher, wie man Textblöcke verallgemeinern und Blöcke vertauschen soll.
Können Sie nach, was Sie bisher versucht haben? – Tbaki
Sicher. Ich habe meine Frage aktualisiert. Ich bin mir nicht sicher, wie man Textblöcke mit "sed" manipulieren kann oder ob es einfach ist. –
Verwenden Sie geeignete XML-orientierte Tools. Versuchen Sie nicht, es mit String-Ersatz zu tun, es wird Sie früher oder später beißen. –