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

如何在许多没有标签的文件中使用ag或找到这样的块?grep <picture>

高级:"id"<block>标签中获取那些。(例如将它们作为列表输出到标准输出)。

4

2 回答 2

1

是的,你可以用你的锤子敲入那个螺丝。
不过我会推荐一把螺丝刀。
我的意思是我会使用解决它的工具:XPath!

/block[not(picture)]

对于伸展目标:

/block[not(picture)]/@id

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

于 2016-09-28T14:47:44.673 回答
0

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

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

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

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

注意:我确信在某些极端情况下这种搜索模式不起作用,但我的快速测试效果很好。

如果您希望进一步将结果限制为仅 ID,请通过管道将另一个 ag 传递给您的结果:

ag '(?s)<block(?!.*?picture).*?</block>' <directory with files> | ag -o 'id="([0-9]+)"' 
于 2017-01-10T21:33:59.113 回答