2014-09-30 75 views
0

我想使用bash工具来抓取标签之间的内容,但前提是模式匹配中间的某处。Sed - 抓住模式匹配的html标签

例如,如果我有这样的文件:

<tag> 
CAT 
</tag> 

... 

<tag> 
DOG 
HORSE 
</tag> 

... 
<tag> 
DOG 
CAT 
</tag> 

我所要的输出是:

<tag> 
CAT 
</tag> 
<tag> 
DOG 
CAT 
</tag> 

我可以用SED打印开始和结束标记cat file.txt | sed -n '/<tag/,/<\/tag/p'的内容,但我如何根据他们是否至少在一行上有“CAT”一词来过滤“每个块”?

回答

1

不知道这是否可以通过sed完成。但如果您愿意使用perl(bash工具),您可以继续使用此正则表达式。

(<tag>(?=(?:(?!<\/tag>).)*CAT)(?:(?!<\/tag>).)*<\/tag>) 

只要抓住了captures.Do不忘加上标志sg。看到演示。

http://regex101.com/r/aW3pR4/8

+0

谢谢!我一直在学习perl这些天的意义.. – anthonybell 2014-09-30 13:43:49

+0

@anthonybell可以请你张贴你使用的最终答案.... – vks 2014-09-30 14:48:07