我需要捕获一个包含特定模式的XML标记,以便将其复制到另一个文件中。复杂的是,标签会重复多次并且内部的行数会有所不同。
输入:
<MainTag>
<Tag1>text</Tag1>
<Tag2>text</Tag2>
<Info>SearchPattern</Info>
<Tag3>text</Tag3>
.....
</MainTag>
<MainTag>
<Tag1>text</Tag1>
<Tag2>text</Tag2>
<Info>SearchPattern</Info>
<Tag3>text</Tag3>
.....
</MainTag>
<MainTag>
..........
</MainTag>
输出:
<MainTag>
<Tag1>text</Tag1>
<Tag2>text</Tag2>
<Info>SearchPattern</Info>
<Tag3>text</Tag3>
.....
</MainTag>
无法使用pcregrep
。
我尝试使用grep -Pzo '(?s)<MainTag.+?Searchpattern.+?</MainTag>'
,但它从Main标记的第一次出现中捕获了文本。
就像Sundeep一样,请使用xml感知工具来处理xml,例如Xidel。
Xidel是一个命令行工具,可使用CSS,XPath 3.0,XQuery 3.0,JSONiq或模式模板从HTML / XML页面以及JSON-API下载和提取数据。它还可以创建新的或转换后的XML / HTML / JSON文档。
xidel -s input.xml -e '//MainTag ! file:write(concat("output",position(),".xml"),outer-xml())'
对于每个“ MainTag”节点,file will be created(在这种情况下为output1.xml
和output2.xml
,带有outer-xml。
另请参见this xidelcgi demo。