获取“expr”的语法错误异常

获取“expr”的语法错误异常

我有一个 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">&lt;!-- </xsl:text>
    <xsl:copy-of select="."/>
    <xsl:text disable-output-escaping="yes"> --&gt;</xsl:text>
  </xsl:template>

</xsl:transform>

XPATH 查询//ReconSummary[entryName = 'Total Deep']/job匹配子节点值为的节点job的子节点。ReconSummaryentryNameTotal Deep

您可以轻松更改此设置以注释掉该Tran节点。 XPATH 查询是

//ReconSummary[entryName = 'Total Deep']/Tran`

要匹配jobTran节点,请使用

//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.

相关内容