'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일치합니다 .jobReconSummaryentryNameTotal 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.

관련 정보