正则表达式发现没有字符串

时间:2016-09-28 14:34:15

标签: regex grep html-parsing ag

<block id="123">
    <othertag1>...</othertag1>
    <othertag2>...</othertag2>
    <picture>...</picture>
    <othertag3>...</othertag3>
    <othertag4>...</othertag3>
</block>

如何使用aggrep在许多文件中找到 no <picture>标记的此类块?

高级:从"id"标记获取<block>。 (例如,将它们作为列表输出到stdout)。

2 个答案:

答案 0 :(得分:1)

是的,你可以用你的锤子驱动螺丝。
我会推荐一把螺丝刀。
我的意思是我会使用解决它的工具:XPath!

/block[not(picture)]

对于伸展目标:

/block[not(picture)]/@id

如果您要解析XML,则应使用XPath。

答案 1 :(得分:0)

如果必须,可以使用珍珠正则表达式,其中点匹配包括换行符。例如,使用ag:

ag '(?s)<block(?!.*?picture).*?</block>'

这将返回跨越多行的块标记之间的内容,同时排除在这两个块标记之间包含图片标记的块。

(?s)表示。匹配包括换行符。 ?!在这种情况下,对于“&#39;图片”这个词来说是一个负面的展望。 *?是第一张图片和第一张图片之前的非贪婪搜索。

注意:我确定这种搜索模式无法正常工作,但我的快速测试效果很好。

如果您希望进一步将结果限制为ID,请在结果中输入另一个结果:

ag '(?s)<block(?!.*?picture).*?</block>' <directory with files> | ag -o 'id="([0-9]+)"'