如何根据给定的文件名更新 XML 中的 <path>
How do I update <path> in my XML according to the given file name
<annotation>
<folder>cars_train</folder>
<filename>00001.jpg</filename>
<path>Users/hantaoliu/Documents/Research/cars_train/.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
上面的文字是我要更新的 XML 文件之一。我有 7k XML 个文件,我希望它们的路径为:
Users/hantaoliu/Documents/Research/cars_train/$@.jpg
$@
对应输入文件的名称。比如输入文件是00001.xml
,我希望路径是:
Users/hantaoliu/Documents/Research/cars_train/00001.jpg
我正在使用 xmlstarlet
,但我无法弄明白?
你可以这样完成你想要的。首先selectfilename
的值和path
的值。
$ filenameVal=$(xmlstarlet sel -t -v "/annotation/filename" file)
$ pathVal=$(xmlstarlet sel -t -v "/annotation/path" file)
接下来通过$(dirname $pathVal)
确定path
的目录名称并将$filenameVal
连接到它。您可以对此进行测试 运行 而无需像这样编辑文件:
$ xmlstarlet ed -u "/annotation/path" -v "$(dirname $pathVal)/$filenameVal" file
<?xml version="1.0"?>
<annotation>
<folder>cars_train</folder>
<filename>00001.jpg</filename>
<path>Users/hantaoliu/Documents/Research/cars_train/00001.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
</size>
</annotation>
如果一切顺利,您可以添加 -L
开关,告诉 xmlstartlet
就地编辑。
$ xmlstarlet ed -L -u "/annotation/path" -v "$(dirname $pathVal)/$filenameVal" file
正在确认 file
中的结果:
$ cat file
<?xml version="1.0"?>
<annotation>
<folder>cars_train</folder>
<filename>00001.jpg</filename>
<path>Users/hantaoliu/Documents/Research/cars_train/00001.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
</size>
</annotation>
参考资料
- xmlstartlet reference - 3. Editing XML documents
- xmlstarlet select value
<annotation>
<folder>cars_train</folder>
<filename>00001.jpg</filename>
<path>Users/hantaoliu/Documents/Research/cars_train/.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
上面的文字是我要更新的 XML 文件之一。我有 7k XML 个文件,我希望它们的路径为:
Users/hantaoliu/Documents/Research/cars_train/$@.jpg
$@
对应输入文件的名称。比如输入文件是00001.xml
,我希望路径是:
Users/hantaoliu/Documents/Research/cars_train/00001.jpg
我正在使用 xmlstarlet
,但我无法弄明白?
你可以这样完成你想要的。首先selectfilename
的值和path
的值。
$ filenameVal=$(xmlstarlet sel -t -v "/annotation/filename" file)
$ pathVal=$(xmlstarlet sel -t -v "/annotation/path" file)
接下来通过$(dirname $pathVal)
确定path
的目录名称并将$filenameVal
连接到它。您可以对此进行测试 运行 而无需像这样编辑文件:
$ xmlstarlet ed -u "/annotation/path" -v "$(dirname $pathVal)/$filenameVal" file
<?xml version="1.0"?>
<annotation>
<folder>cars_train</folder>
<filename>00001.jpg</filename>
<path>Users/hantaoliu/Documents/Research/cars_train/00001.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
</size>
</annotation>
如果一切顺利,您可以添加 -L
开关,告诉 xmlstartlet
就地编辑。
$ xmlstarlet ed -L -u "/annotation/path" -v "$(dirname $pathVal)/$filenameVal" file
正在确认 file
中的结果:
$ cat file
<?xml version="1.0"?>
<annotation>
<folder>cars_train</folder>
<filename>00001.jpg</filename>
<path>Users/hantaoliu/Documents/Research/cars_train/00001.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
</size>
</annotation>
参考资料
- xmlstartlet reference - 3. Editing XML documents
- xmlstarlet select value