두 패턴 사이에 텍스트 삽입

두 패턴 사이에 텍스트 삽입

.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그리고 다른 많은 언어는 많은 솔루션에 영감을 준 일반적인 문제입니다)

관련 정보