하나의 하위 노드에서만 xmlstarlet을 사용하여 XML 편집

하나의 하위 노드에서만 xmlstarlet을 사용하여 XML 편집

명령을 사용할 때:

-bash-4.2$ xmlstarlet ed -u "/configurations/rules/rule/branch" -v 'DAVID' config.xml > final.xml

출력 파일이 다음으로 변경된 것을 확인했습니다.데이비드, 그러나 "branch" 태그가 선언된 모든 곳에서 전역 변경이 이루어집니다.

하지만 하나의 하위 노드(예: "APP1")에서만 변경하고 싶습니다. 어떤 명령을 사용해야 합니까? "DAVID" 값을 매개변수로 전달하는 방법이 있나요?

  <configurations>
    <smtpHost>smtp3.gmail.com</smtpHost>
    <smtpPort>25</smtpPort>
    <emailFrom>[email protected]</emailFrom>
    <emailSubject>Push notification</emailSubject>
    <!-- Stash general URL-->
    <gitViewerURL>http://mydtbld0005.gmail.com:7990/projects/</gitViewerURL>

    <!-- repositories list and commit URL path per repo -->

    <repositoryViewerPath name="hookTester" path="DevOps/repos/hooktester/commits/"/>

    <separator>#@#</separator>
    <catExe>cat</catExe>
    <catExeWindows>type</catExeWindows>
    <gitExe>git</gitExe>
    <gitExeWindows>C:\\Program Files (x86)\\Git\\cmd\\git.exe</gitExeWindows>
    <gitFolder>/gitdata/alm_mng.git</gitFolder>
    <gitFolderWindows>c:\gitdata\alm_mng.git</gitFolderWindows>
      <rules>
            <rule>
                <name>APP1</name>
                <repo>hookTester</repo>
                <branch>refs/heads/master</branch>
                <emailTo>[email protected]</emailTo>
                <path>F1/ido.xml </path>
            </rule>
            <rule>
                <name>APP2</name>
                <repo>hookTester</repo>
                <branch>refs/heads/master</branch>
                <emailTo>[email protected]</emailTo>
                <path>F2/ido.xml </path>
            </rule>
       </rules>
  </configurations> 

답변1

xmlstarlet해결책:

new_branch="DAVID"
xmlstarlet ed -u "/configurations/rules/rule[name='APP1']/branch" -v "$new_branch" config.xml > final.xml

<rule>노드는 다음과 같아야 합니다.

<rule>
      <name>APP1</name>
      <repo>hookTester</repo>
      <branch>DAVID</branch>
      <emailTo>[email protected]</emailTo>
      <path>F1/ido.xml </path>
    </rule>

초기 파일을 수정할 수도 있습니다.제자리에전역 옵션을 적용하면 다음과 같습니다 -L.

xmlstarlet ed -L -u ... config.xml

관련 정보