2017-10-16 1 views
-1

에 bash는 XML 값을 교체 나는 다음과 같은 XML 데이터가 있습니다리눅스

<info> 
    <data> 
     <name>my_image</name> 
     <value>site.com/image1.img</value> 
    </data> 
    <data> 
     <name>my_link</name> 
     <value>site.com/p_info</value> 
    </data> 
</info> 

내가 (단지 my_image 속성에 대한) 모든 my_image 값의 siteimag.com에 모든 site.com을 대체 할을.

그래서 결과는 다음과 같습니다

<info> 
    <data> 
     <name>my_image</name> 
     <value>siteimag.com/image1.img</value> 
    </data> 
    <data> 
     <name>my_link</name> 
     <value>site.com/p_info</value> 
    </data> 
</info> 
가 나오지 명령을 수행 할 수 있습니다 어떻게

?

감사합니다.

+0

XML 파싱은 나쁜 생각 – RomanPerekhrest

답변

1
sed '/my_image/{n;s/site.com/siteimag.com/}' file 

간략한 설명,

  • /my_image/

    : 라인이
    • 명령 n을 사용하여 다음 줄을 읽기 "my_image"
    • 문자열이 검색되면을 포함 검색합니다.
    • s/site.com/siteimag.com/ : 같은 XML 문서를 작성하고 여러 가지 방법으로 포맷 할 수 있습니다
1

대체를 수행 때문에 매우 깨지기 쉬운 일, 그것은을 업데이트 sed 같은 간단한 텍스트 도구를 것 사용 부수다.

예. 바로 위의 순진한 sed 스크립트 휴식, namevalue 사이에 빈 줄을합니다 추가 : 그것은 또한 정말 XML 구조를 따라 갈 수 없어

<data> 
    <name>my_image</name> 

    <value>site.com/image1.img</value> 
</data> 

을하고 my_image 패턴이있는 경우 단순히 어떤 site.com 참조를 대체합니다 위의 라인은 경우에도 그것은 주석에 있습니다

<data> 
    <name>my_link</name> <!-- Used to be "my_image" --> 
    <value>site.com/p_info</value> 
</data> 

이 그대로 다른 방법의 수백, 소스 XML은 휴식 또는 거짓 교체 될 수 있도록, 그것은 의미의 변경하지 않고 변경 될 수 있습니다 .

이렇게하려면 XML 인식 도구를 사용해야합니다. xmlstarlet :

xmlstarlet ed \ 
-u "//data/name[text()='my_image']/../value" \ 
-x "concat(substring-before(.,'site.com'),'sitemag.com',substring-after(.,'site.com'))"| 
data.xml 
0

올바른 방법 XML 파서를 사용 xmlstarlet 같은 :

xmlstarlet ed -u "//data/name[text()='my_image']/following-sibling::value" \ 
-v "$(sed 's/site/&imag/' <(xmlstarlet sel -t -v "//data/name[text()='my_image']/following-sibling::value" file.xml))" file.xml 

출력 : 나오지와

<?xml version="1.0"?> 
<info> 
    <data> 
    <name>my_image</name> 
    <value>siteimag.com/image1.img</value> 
    </data> 
    <data> 
    <name>my_link</name> 
    <value>site.com/p_info</value> 
    </data> 
</info>