我这里有个小问题,我真的希望某个Linux魔术师能帮我个忙.我有一个文件夹/assets,里面有.jpg.xml个文件--非常多.

原始的XML struct :

<annotation>
    <folder></folder>
    <filename>Pro_jpeg.rf.77216510eeb475f923d5bb3bdb22ee11.jpg</filename>
    <path>Pro_jpeg.rf.77216510eeb475f923d5bb3bdb22ee11.jpg</path>
    <source>
        <database>roboflow.ai</database>
    </source>
    <size>
        <width>416</width>
        <height>416</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>
        <name>cheese</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>53</xmin>
            <xmax>371</xmax>
            <ymin>224</ymin>
            <ymax>391</ymax>
        </bndbox>
    </object>
</annotation>

如果你看一看,你可以看到在<bndbox>个标签中,我已经遵循了定义的参数:xmin, xmax, ymin and ymax-在这个序列中.这是错误的,我想用以下顺序更新我所有的.xml文件:xmin, ymin, xmax, ymax.因此,该文件将以如下形式结束:

<annotation>
    <folder></folder>
    <filename>Pro_jpeg.rf.77216510eeb475f923d5bb3bdb22ee11.jpg</filename>
    <path>Pro_jpeg.rf.77216510eeb475f923d5bb3bdb22ee11.jpg</path>
    <source>
        <database>roboflow.ai</database>
    </source>
    <size>
        <width>416</width>
        <height>416</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>
        <name>cheese</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>53</xmin>
            <ymin>224</ymin>
            <xmax>371</xmax>
            <ymax>391</ymax>
        </bndbox>
    </object>
</annotation>

有什么 idea 可以做到这一点吗?提前谢谢你了!

编辑(我当前拥有的内容): 所以我打开终端,导航到文件夹:CD桌面,并调用这个块.所有文件都位于桌面/cheese1文件夹中:

for file in cheese1/*.xml; do
    xmlstarlet edit -L --delete "//bndbox/xmax" --insert "//bndbox/ymin" --to "//bndbox/xmin" \
        --insert "//bndbox/xmax" --to "//bndbox/ymax" \
        "$file"
done

什么都没有发生,所以不确定是语法错误,还是逻辑错误,还是两者兼而有之.

推荐答案

SED解决方案,它假设所有输入数据的格式都如示例中所示,并且错误的顺序始终排序为xmin > xmax > ymin > ymax:

sed '/<bndbox>/,/<\/bndbox>/{/<xmax>/{h;d};/<ymin>/G}' cheese1/*.xml

如果输出结果令您满意,请使用sed -i在位编辑文件.

它的工作方式很简单.在<bndbox>...</bndbox>行之间,我们保存<xmax>行并删除它,然后当我们遇到<ymin>行时,我们将先前保存的<xmax>行粘贴到<ymin>行之后.

Linux相关问答推荐

如何正确Forking 并完成进程以避免 EAGAIN 错误

在 Bash 中使用 shell 脚本从文件中解析版本号

使用awk命令将以:分隔的两个文件合并的方法

在不编写任何代码的情况下,是否有一个命令可以检索当前 shell 的亲和力中的可用内核数?

删除一行和它之前的一行

c++进程状态中的+是什么意思

bind(): "无法分配请求的地址"

linux shell获取多文件交集

如何用 Sed 替换 Match 后的 2 个连续行

MessageBox 的 GTK 实现

在 Python 上模拟鼠标点击

来自远程主机的 mysqldump

使用 rc.local 运行脚本:脚本有效,但在启动时无效

如何将 bash 别名定义为多个命令的序列?

为什么两次使用 grep 时没有显示输出?

在 bash 中将输出作为 cp 的参数传递

在 shell 脚本的 for 循环中迭代行而不是单词

env和set(在 Mac OS X 或 Linux 上)有什么区别?

如何通过进程名获取PID?

带有日期和时间的 Linux 命令历史记录