<block id="123">
<othertag1>...</othertag1>
<othertag2>...</othertag2>
<picture>...</picture>
<othertag3>...</othertag3>
<othertag4>...</othertag3>
</block>
如何使用ag
或grep
在许多文件中找到 no <picture>
标记的此类块?
高级:从"id"
标记获取<block>
。 (例如,将它们作为列表输出到stdout)。
答案 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]+)"'