파일의 두 화살표 사이의 모든 숫자를 0으로 바꾸는 bash 스크립트가 필요합니다.

파일의 두 화살표 사이의 모든 숫자를 0으로 바꾸는 bash 스크립트가 필요합니다.

파일 이름은 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( )으로 설정하여 데이터를 편집( )합니다.-unominal//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--inplaceed

답변3

또는 regex"역참조"를 사용하십시오.

sed 's@\(<nominal>\)[0-9]*\(</nominal>\)@\10\2@' types.xml

관련 정보