.xml
다음 내용이 포함된 파일이 있습니다.
<controller-host></controller-host>
<controller-port></controller-port>
<tier-name></tier-name>
<node-name></node-name>
나는 이런 출력을 원한다
<controller-host>AppDynamicsHost</controller-host>
<controller-port>80</controller-port>
<tier-name>**the host name**</tier-name>
<node-name>tomcat server</node-name>
사용하려고 했는데 sed
작동하지 않습니다.
답변1
해당 파일은 유효한 xml이 아닙니다. 열기 및 닫기 루트 태그를 추가해야 합니다. 이와 같이:
<xml>
<controller-host></controller-host>
<controller-port></controller-port>
<tier-name></tier-name>
<node-name></node-name>
</xml>
이 입력을 사용하면 xml 파서를 사용하여 xmlstartlet
콘텐츠를 편집할 수 있습니다.
xmlstarlet ed -O -u //controller-host -v "AppDynamicsHost" \
-u //controller-port -v "80" \
-u //tier-name -v "the hostname" \
-u //node-name -v "tomcat server" file
ed
편집 모드 시작xmlstartlet
-O
<?xml version="1.0"?>
선언 생략-u
주어진 xpath를 업데이트하십시오.-v
주어진 값을 설정
그러면 출력은 다음과 같습니다.
<xml>
<controller-host>AppDynamicsHost</controller-host>
<controller-port>80</controller-port>
<tier-name>the hostname</tier-name>
<node-name>tomcat server</node-name>
</xml>
파일을 그 자리에서 직접 편집하려면 이 플래그를 사용할 수 있습니다 -L
.
답변2
다음과 같이 시도해 볼 수 있습니다.
$host='hostname'
sed -i 's/<controller-host><\/controller-host>/<controller-host>AppDynamicsHost<\/controller-host>/' yourfile.xml
sed -i 's/<controller-port><\/controller-port>/<controller-port>80<\/controller-port>' yourfile.xml
sed -i "s/<tier-name><\/tier-name>/<tier-name>${host}<\/tier-name>/' yourfile.xml
sed -i 's/<node-name><\/node-name>/<node-name>tomcat server<\/node-name>/' yourfile.xml
이 -i
플래그는 결과를 파일에 기록하고 -i
동시 테스트 없이 실행해 본다는 의미입니다.
답변3
Chaos가 말했듯이, 파일을 유효한 XML 파일로 만들고 xmlstarlet
유사한 XML 처리 도구(예: xsh
)를 사용하는 것이 "올바른" 대답입니다... 그러나 간단한 템플릿 작성을 원하는 경우 입력을 수정하게 됩니다. 변경하려는 위치에서 토큰을 쉽게 찾아 교체할 수 있는 파일입니다. 예를 들어:
<controller-host>__CONTROLLER__</controller-host>
<controller-port>__PORT__</controller-port>
<tier-name>__HOSTNAME__</tier-name>
<node-name>__NODENAME__</node-name>
그런 다음 일반적인 도구(awk, sed, perl, ruby 등)를 사용하여 __CONTROLLER__
etc를 원하는 실제 값으로 바꿀 수 있습니다.
참고: 텍스트에 표시되지 않는 문자열을 사용하는 것이 중요합니다. 그래서 __
예 __PORT__
를 들어 단순히 PORT
.
이것은 매우 간단한 템플릿 요구 사항에 적합합니다. 더 복잡한 템플릿을 수행해야 하는 경우 많은 언어에는 매우 정교한 템플릿 라이브러리가 있습니다. 예를 들어 perl
( Text::Template
그리고 다른 많은 언어는 많은 솔루션에 영감을 준 일반적인 문제입니다)