我有一个 xml 文件,如下所示
输入 XML 文件
<ReconSummary>
<entryName>Total Deep</entryName>
<Code>777</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>
<ReconSummary>
<entryName>Total Saurav</entryName>
<Code>666</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>
<ReconSummary>
<entryName>Total Ankur</entryName>
<Code>555</Code>
<License>L</License>
<Tran>H20</Tran>
<job>1234</job>
</ReconSummary>
我试图搜索模式“Total Deep”,之后我想注释掉 xml 文件中匹配模式的第三行或第四行之后的标签
我的代码如下
while read -r line do;
LineNum=`grep -n "Total Deep" input.xml | cut -d: -f 1`
TOTAL=`expr $LineNum + 4`
echo $LineNum
echo $TOTAL
done < file.txt
在执行代码时我遇到以下异常
expr: syntax error
谁能告诉我这段代码有什么问题吗?
答案1
您的问题是grep
返回与您的表达式匹配的多行。您最终执行的内容expr
类似于expr 1 3 4 + 4
(如果第 1、3 和 4 行有匹配项)。这就是您的语法错误的来源。
从注释中可以清楚地看出,您想要从特定节点注释掉特定子节点ReconSummary
。如果你想删除例如job
节点,我建议使用
xmlstarlet ed -d '//ReconSummary[entryName = "Total Deep"]/job' file.xml >newfile.xml
...但是注释掉而不是删除有点棘手。
如同对你之前问题的回答我刚才写的,这将通过 XSL 转换来完成:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/|node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//ReconSummary[entryName = 'Total Deep']/job">
<xsl:text disable-output-escaping="yes"><!-- </xsl:text>
<xsl:copy-of select="."/>
<xsl:text disable-output-escaping="yes"> --></xsl:text>
</xsl:template>
</xsl:transform>
XPATH 查询//ReconSummary[entryName = 'Total Deep']/job
匹配子节点值为的节点job
的子节点。ReconSummary
entryName
Total Deep
您可以轻松更改此设置以注释掉该Tran
节点。 XPATH 查询是
//ReconSummary[entryName = 'Total Deep']/Tran`
要匹配job
和Tran
节点,请使用
//ReconSummary[entryName = 'Total Deep']/*[name()='job' or name()='Tran']
正如我之前的回答一样,您可以使用以下任一方法将此 XSL 转换应用于您的 XML 文件:
xmlstarlet tr transform.xsl file.xml >newfile.xml
或者
xsltproc transform.xsl file.xml >newfile.xml
文件所在的位置file.xml
以及转换存储在transform.xsl
.