代码之家  ›  专栏  ›  技术社区  ›  Liu Hantao

如何根据给定的文件名更新XML中的<path>

  •  2
  • Liu Hantao  · 技术社区  · 6 年前
    <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 但我没办法搞清楚?

    1 回复  |  直到 6 年前
        1
  •  1
  •   slm Vikas Hardia    6 年前

    你可以这样做。首先选择的值 filename 以及 path .

    $ filenameVal=$(xmlstarlet sel -t -v "/annotation/filename" file)
    $ pathVal=$(xmlstarlet sel -t -v "/annotation/path" file)
    

    下一步确定目录名 路径 通过 $(dirname $pathVal) 并连接 $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>
    

    工具书类