Bash 쉘 스크립트를 통해 XML 파일을 조작해야 하는 작업이 있습니다.
다음과 같이 진행하세요:
- XML 파일의 값을 쿼리합니다.
- 다른 요소의 값을 새로운 값으로 바꿉니다.
다음은 샘플 XML입니다.
<context-param>
<param-name>com.sun.faces.sendPoweredByHeader</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.numberOfViewsInSession</param-name>
<param-value>25</param-value>
</context-param>
<context-param>
<param-name>testing</param-name>
<param-value>25</param-value>
</context-param>
parm 값을 업데이트하려면 쉘 스크립트를 사용해야 합니다 <param-value>25</param-value>
.<param-value>3</param-value>
매개변수 name() 의 매개변수 값만 업데이트하는 SED 명령이 무엇인지 아시나요 <param-name>com.sun.faces.numberOfViewsInSession</param-name>
?
다음 명령을 사용해 보았습니다.
sed -i 's/<param-value>25<\/param-value>/<param-value>3<\/param-value>/' test.xml
하지만 이 명령은 모든 매개변수 값을 업데이트합니다. com.sun.faces.numberOfViewsInSession을 업데이트하면 됩니다.
답변1
XMLStarlet을 사용하고 문서에 루트 노드가 있다고 가정합니다.
xmlstarlet ed \
-u '//context-param[param-name = "com.sun.faces.numberOfViewsInSession"]/param-value[. = 25]' \
-v 3 file.xml
그러면 올바른 param-value
노드(값이 25인 노드( [. = 25]
이전 값이 중요하지 않은 경우 비트 제거)와 자식 값이 25인 노드의 자식 context-param
)가 선택되고 해당 값이 3으로 변경됩니다.param-name
com.sun.faces.numberOfViewsInSession
생성된 문서는 다음과 같습니다( root
가짜 노드 삽입).
<?xml version="1.0"?>
<root>
<context-param>
<param-name>com.sun.faces.sendPoweredByHeader</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.numberOfViewsInSession</param-name>
<param-value>3</param-value>
</context-param>
<context-param>
<param-name>testing</param-name>
<param-value>25</param-value>
</context-param>
</root>
답변2
sed -i 's#<param-value>25</param-value>#<param-value>3</param-value>#' test.xml
답변3
다음 sed 명령을 사용하면 특정 태그 값을 업데이트할 수 있습니다.
sed -i '/<param-name>com.sun.faces.numberOfViewsInSession<\/param-name>/{n;s/<param-value>3<\/param-value>/<param-value>25<\/param-value>/}' test.xml