파일 이름은 type.xml이며 수백 가지의 다양한 항목이 나열되어 있습니다.
다음과 같습니다.
<type name="CanisterGasoline">
<nominal>50</nominal>
<lifetime>28800</lifetime>
<restock>0</restock>
<min>30</min>
<quantmin>-1</quantmin>
<quantmax>-1</quantmax>
<cost>100</cost>
<flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
<category name="tools"/>
<tag name="shelves"/>
<usage name="Industrial"/>
</type>
<type name="Canteen">
<nominal>20</nominal>
<lifetime>14400</lifetime>
<restock>0</restock>
<min>10</min>
<quantmin>10</quantmin>
<quantmax>90</quantmax>
<cost>100</cost>
<flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
<category name="food"/>
<usage name="Military"/>
</type>
기본적으로 무슨 말이든 간에 <nominal>20</nominal>
숫자를 0과 사이로 변경하고 싶습니다.<nominal>
</nominal>
시간을 내주셔서 감사합니다!
답변1
이 작업을 수행하려면 sed
다음을 수행할 수 있습니다.
sed 's@<nominal>[0-9]*</nominal>@<nominal>0</nominal>@' types.xml > output.xml
<nominal>
뒤에 오는 일련의 숫자를 로 </nominal>
대체 합니다 <nominal>0</nominal>
.
그러나 이 작업에 왜 전용 XML 파서를 사용해야 하는지, 어떤 파서를 사용해야 하는지, 어떻게 사용하는지에 대한 제안이 곧 누군가 나올 것이라고 확신합니다.
답변2
XML 문서의 형식이 올바르다고 가정하고(예제에 루트 노드가 누락됨) node의 값이 20이면 xmlstarlet
다음과 같이 -node 값을 0으로 바꿀 수 있습니다.nominal
xmlstarlet ed -u '//nominal[text() = 20]' -v 0 types.xml
이는 ed
입력 문서( )에서 값이 20( )인 모든 노드를 업데이트( )하고 해당 노드의 값을 0( )으로 설정하여 데이터를 편집( )합니다.-u
nominal
//nominal
[text() = 20]
-v 0
샘플 문서에 루트 노드를 추가하고 이 결과를 실행하세요.
<?xml version="1.0"?>
<root>
<type name="CanisterGasoline">
<nominal>50</nominal>
<lifetime>28800</lifetime>
<restock>0</restock>
<min>30</min>
<quantmin>-1</quantmin>
<quantmax>-1</quantmax>
<cost>100</cost>
<flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
<category name="tools"/>
<tag name="shelves"/>
<usage name="Industrial"/>
</type>
<type name="Canteen">
<nominal>0</nominal>
<lifetime>14400</lifetime>
<restock>0</restock>
<min>10</min>
<quantmin>10</quantmin>
<quantmax>90</quantmax>
<cost>100</cost>
<flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
<category name="food"/>
<usage name="Military"/>
</type>
</root>
상위 노드의 값 xmlstarlet
과 같은 문서의 다른 값으로 값을 업데이트할 수도 있습니다 .restock
xmlstarlet ed -u '//nominal[text() = 20]' -x '../restock/text()' types.xml
명령줄 바로 뒤에 또는 옵션을 제공하면 xmlstarlet
유틸리티에서 내부 편집을 수행할 수 있습니다 .-L
--inplace
ed
답변3
또는 regex
"역참조"를 사용하십시오.
sed 's@\(<nominal>\)[0-9]*\(</nominal>\)@\10\2@' types.xml