아래와 같이 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
.