2016-06-08 4 views
0

쉘 변수를 사용하여 새 xml 태그를 검색하고 추가하고 싶습니다.쉘 스크립트에서 sed를 사용하여 새 xml 태그 추가

아래의 명령을 사용하면 KVM_IF_LIST_FILE은 인스턴스의 모든 인터페이스 이름을 저장합니다 (예 : eno1 eno2 eno3 eno4의 경우 포함).

virsh domiflist $kvm_name|awk {'print $3'}|awk 'NR>2' >> $KVM_IF_LIST_FILE 

지금 나는 위의 패턴을 발견하면, <source dev='eno0/1/2/3' mode='bridge'/>를 검색 할 필요가 옆에있는 위의 패턴에 새로운 XML 노드 (<target dev=\'$kvm_name$cnt\'/>)를 추가해야합니다. 이 경우에는 작동하지 않는 쉘 스크립트를 작성했습니다.

cnt=0 
for i in `cat $KVM_IF_LIST_FILE` 
do 
echo "Updating macvtap device names for $i" 
sed -i.bak "/source dev='\'/a <target dev=\'$kvm_name$cnt\'/>" $XML_FILE 
cnt=`expr $cnt + 1` 
done 

위의 스크립트를 수정하여 위의 검색 및 바꾸기를 수행하는 방법을 알려주십시오.

+3

XML 인식 도구를 사용하여 XML 문서를 수정하십시오. – choroba

+1

여기서 [sed] xml을 검색하면 1400+ 답을 찾을 수 있습니다. 그들 중 누구 한테 루크 봤니? 행운을 빕니다. – shellter

+0

사실 비 XML 인식 도구를 사용하면 XML 인식 도구로이 작업을 수행하는 것이 쉽지만 * 코드가 손상된 문서를 생성하는 경우가있을 수 있습니다. –

답변

0

아직 알지 못하지만 곧 발견 될 XML은 으로 구문 분석하면 결국 문제가 발생합니다. 예 : 동일한 태그를 반복해서 사용할 수 있습니다. regexp로 파싱 할 수 없습니다.

먼저 XSL (good tutorials)을 올바르게 수정하여 XML을 올바르게 변환하십시오. 좋은 오픈 소스 도구는 예를 들어 xsltproc입니다.

1

주어진 다음의 문서 : 다음과 같은 출력 결과 ...

kvm_name=hello 
cnt=5 
xmlstarlet ed \ 
    --var kvm "'$kvm_name$cnt'" \ 
    -a '//source' -t elem -n target -v "$kvm_name$cnt" \ 
    -i '//target' -t attr -n dev -v "$kvm_name$cnt" \ 
    -d '//target[.=$kvm]/text()' <foo.xml 

:

<root> 
    <prior/> 
    <source dev='foo'/> 
    <successor/> 
</root> 

은 ... 우리가 같이 일치 source 요소에 다음과 같은 새로운 <target> 요소를 추가 할 수 있습니다 :

<?xml version="1.0"?> 
<root> 
    <prior/> 
    <source dev="foo"/> 
    <target dev="hello5"/> 
    <successor/> 
</root> 
+0

필자는 그렇게 할 수 있고'xmlstarlet ed -a // source -t elem -n target -i // target -t attr -n dev -v "hello5"'와 같이 짧아야한다고 생각합니다. 나중에 노드를 삭제하기 위해 노드에 텍스트를 추가 할 필요가 없습니다. –

+0

@MichaelVehrs, 텍스트 추가 지점은 특정 노드를 올바르게 식별하는 것입니다. 목표는 모든 ** 타겟에 속성을 추가하는 것이 아니라 직전 작업 중에 추가 한 특정 타겟 만 추가하는 것입니다. 'hello1'에서'hello4'까지 다른 타겟이 이미 존재한다면, 우리는 그것들을 편집하고 싶지 않을 것입니다. –

+0

나는 본다. 하지만 더 구체적인 xpath 표현으로이를 달성 할 수는 없습니까? –

관련 문제