명령을 사용할 때:
-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