다음 XML 파일이 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<deviceID>IO238470374109730497</devicdeID>
<KeyValuePairs>
<KeyValuePair>
<BASE-URL>2</BASE-URL>
<Key>2</Key>
<Value>2</Value>
</KeyValuePair>
<KeyValuePair>
<BASE-URL>3</BASE-URL>
<Key>3</Key>
<Value>3</Value>
</KeyValuePair>
</KeyValuePairs>
이 부분만 제거하고 싶습니다.
<KeyValuePair>
<BASE-URL>3</BASE-URL>
<Key>3</Key>
<Value>3</Value>
</KeyValuePair>
내가 달성하고 싶은 것은 내부 콘텐츠를 제거하고 <KeyValuePair>
이러한 특정 <BASE-URL>
, <Key>
및 <Value>
. 튜플은 <KeyValuePair>
항상 고유하며 반복되지 않지만 하나 이상이 될 수 있습니다.
Bash를 사용하여 이 작업을 어떻게 수행할 수 있나요?
답변1
귀하의 예는 유효한 XML 파일이 아닙니다. <root/>
문서 주위에 요소를 추가하고 닫는 태그의 오타를 수정하여 </deviceID>
약간 변경했습니다 .
<?xml version="1.0" encoding="utf-8"?>
<root>
<deviceID>IO238470374109730497</deviceID>
<KeyValuePairs>
<KeyValuePair>
<BASE-URL>2</BASE-URL>
<Key>2</Key>
<Value>2</Value>
</KeyValuePair>
<KeyValuePair>
<BASE-URL>3</BASE-URL>
<Key>3</Key>
<Value>3</Value>
</KeyValuePair>
</KeyValuePairs>
</root>
이제 XML 편집 도구를 사용하여 XML을 편집할 수 있습니다. 이 XPath 표현식은 텍스트 값이 포함된 xmlstarlet
XML 요소 (및 해당 내용) 가 삭제됨을 나타냅니다 <KeyValuePair/>
.<BASE-URL/>
3
xmlstarlet ed -d '//KeyValuePair[BASE-URL/text()="3"]' /tmp/500185.xml
출력은 다음과 같습니다
<?xml version="1.0" encoding="utf-8"?>
<root>
<deviceID>IO238470374109730497</deviceID>
<KeyValuePairs>
<KeyValuePair>
<BASE-URL>2</BASE-URL>
<Key>2</Key>
<Value>2</Value>
</KeyValuePair>
</KeyValuePairs>
</root>