如何根据给定的文件名更新 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>

参考资料