<ns:tag2>
Linux의 XML 파일에 있는 XML 태그 값에서 공백과 따옴표를 제거하고 싶습니다 (이 태그에 대해서만 공백을 제거하고 다른 곳에서는 제거하지 않음).
XML 콘텐츠의 예는 다음과 같습니다.
<ns:tag1>
<ns:tag2>Abcdef qwert/denn+hkg kmknn xyz""""""""""</ns:tag2>
</ns:tag1>
하지만 아래와 같이 파일에 써야 합니다.
<ns:tag1>
<ns:tag2>Abcdefqwert/denn+hkgkmknnxyz</ns:tag2>
</ns:tag1>
나는 다음에서 해결책을 보았습니다.XML 파일에서 공백과 따옴표가 포함된 문자열 제거sed 명령을 사용하여 따옴표를 제거하려고 시도했지만 성공하지 못했습니다.
sed 's/ ""//g' temp.xml
올바른 구문을 제안해 주세요. 이 작업을 두 가지 다른 단계로 수행할 수 있다면 좋을 것입니다.
답변1
이것이 작업을 수행하는 XSLT 3.0 변환입니다.
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="ns:tag2/text()" xmlns:ns="xxxxx">
<xsl:value-of select="translate(., '" ', '')"/>
</xsl:template>
</xsl:template>
실제 네임스페이스 URI로 바꿉니다 xxxxx
(예제에는 표시되지 않음).
어휘 수준에서 XML을 처리하기 위해 sed와 같은 비XML 인식 도구를 사용하지 마십시오. 잘못된 XML을 처리해야 하는 사람들로 인해 StackOverflow에서 수백 가지 문제가 발생하는 것을 볼 수 있으며 이러한 문제는 항상 이러한 유형의 접근 방식에서 발생합니다.
답변2
XML 파서를 사용하여 XML을 구문 분석할 수 있습니다. 나는 xmlstarlet
나 자신을 좋아한다.
(어렴풋하게) 합리적인 네임스페이스 선언을 제공하기 위해 귀하의 예제를 수정했습니다 ns
.
<ns:root xmlns:ns="localns">
<ns:tag1>
<ns:tag2>Abcdef qwert/denn+hkg kmknn xyz""""""""""</ns:tag2>
</ns:tag1>
</ns:root>
이 시점에서 공백과 따옴표를 다음으로 바꿀 수 있습니다.아무것도 없다:
xmlstarlet edit -N ns=localns -u '//ns:tag2/text()' -x "translate(., ' \"', '')" xmlfile
결과
<?xml version="1.0"?>
<ns:root xmlns:ns="localns">
<ns:tag1>
<ns:tag2>Abcdefqwert/denn+hkgkmknnxyz</ns:tag2>
</ns:tag1>
</ns:root>