![在 XML 文件中查找特定字符串并存储在另一个文件中](https://linux22.com/image/147161/%E5%9C%A8%20XML%20%E6%96%87%E4%BB%B6%E4%B8%AD%E6%9F%A5%E6%89%BE%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B9%B6%E5%AD%98%E5%82%A8%E5%9C%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD.png)
输入文件中的文本是这样的
<title>
<band height="21" isSplitAllowed="true" >
<staticText>
<reportElement
x="1"
y="1"
width="313"
height="20"
key="staticText-1"/>
<box></box>
<textElement>
<font fontName="Arial" pdfFontName="Helvetica-Bold" size="14" isBold="true" isUnderline="true"/>
</textElement>
<text><![CDATA[4) Computation of Tier I and Tier II Capital :]]></text>
</staticText>
</band>
</title>
输出文件应具有:
4) Computation of Tier I and Tier II Capital :
该文件有很多<title>
和[CDATA]
标签。但我想复制标签下的文本<title>
并将<CDATA>
其输出保存在另一个文件中。
答案1
看起来您可能尝试将一对**
序列放入您的CDATA
部分中以在此处突出显示。不幸的是,这已将其变成无效的 XML。假设你的意思是这个,
<text><![CDATA[4) Computation of Tier I and Tier II Capital :]]></text>
您可以使用 XML 解析器来解析 XML:
xmlstarlet sel -T -t -v '//text' -n x.xml
4) Computation of Tier I and Tier II Capital :
如果您有比“元素的内容<text/>
”更严格的约束,您可以适当调整 XPath 过滤器。例如:
xmlstarlet sel -T -t -v '/title/band/staticText/text' -n x.xml
4) Computation of Tier I and Tier II Capital :
答案2
像这样?
$ sed -n '/<title>/,/<\/title>/p' input.txt | grep -oP '(?<=\[CDATA\[).*(?=\])'
sed
将打印<title>
和之间的所有内容</title>
(并包含此标签)。如果您[CDATA
总是在该区域,则可以省略此步骤grep
将打印出其之前[CDATA[
和之后的所有内容]