Bash使用regex从SVN日志XML获取文件名

时间:2017-01-30 10:07:13

标签: regex xml bash svn grep

我有svn日志XML文件,我想检索更改的文件。

<Paths>可以包含一个或多个名为<Path>的子元素。

在这种情况下,我想要检索/trunk/server/sub/sub1/scripts/fix/filename.sql

issues.xml(片段)的内容:

<paths>
    <path
        action="A"
        prop-mods="false"
        text-mods="true"
        kind="file">/trunk/server/sub/sub1/scripts/fix/filename.sql</path>
</paths>

为此,我使用以下bash脚本:

#!bin/bash
filenames=($(grep -oP '<path[^>]*>(.+?)<\/path>' "issues.xml"))
echo $filenames

此脚本的输出为空。我不知道为什么。我试图在循环中输出所有数组元素,但这也不起作用。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

使用标准文本处理器解析XML通常是 NOT

建议使用正确的XML解析器,如xmllintxmlstarlet处理您的文件,即使原始文件经过格式更改(例如添加新的空白区域),正则表达式用于提取需要经历变化。

xmllintxpath表达式一起使用实在太容易了。对于您的给定输入文件,只需执行,

xmllint --xpath 'string(//path)' file
/trunk/server/sub/sub1/scripts/fix/filename.sql

download and install xmllint的步骤非常简单。

答案 1 :(得分:0)

可能你可以试试这个:

grep -oP '([^>]*)(?=</path>)' file