2012-09-18 5 views
1

replacetest.xml 파일의 일부 텍스트를 바꿀려고합니다.파일에서 bash 문자열 바꾸기

여기는 수정하려는 파일의 일부입니다.

<class name="replace_after_this_string">randomtext</class>

나는 나의 배열

orgs=(item1 item2) 

의 인덱스에있는 텍스트와 텍스트 randomtext을 변경하고 이러한 수정하여 파일을 덮어 쓸 것인지.

내 주요 문제는 와일드 카드와 sed 명령입니다. 그래서 여기에 내가

orgs=(item1 item2) 

SRC="name="'"replace_after_this_string"'">" 
#need some sort of wildcard here 


for i in "${orgs[@]}" 
do 
: 
    # do whatever on $i 
    DST=$SRC$i 

    sed -e 's/$SRC/$DST/g' -i replacetest.xml 

done 

1) 나는 아무것도하지 않는 변수 $SRC

2) 내 나오지 문에있을 것입니다 무엇을 식별 한 후 내가 randomtext을 대체 할 것인지 지정하기 위해 와일드 카드를 필요로 뭘하려 명령 행에 인쇄하는 것을 제외하고, 내 파일을 전혀 수정하지 않습니다. 심지어 명령 행에 인쇄되는 내용도 포함합니다.

답변

3

XML 파일의 구조를 이해하지 못하기 때문에 sed가 잘못된 도구라고 생각합니다. 따라서 결과적으로 스크립트는 전혀 작동하지 않아도 부서지기 쉽습니다. 답이 Brian Agnew suggests으로 xmlstarlet은 XML 파일을 조작하는 데 유용한 도구입니다. 예를 들어, 다음 파일 (12477913.xml 말) 인 경우로 :

<?xml version="1.0"?> 
<foo> 
    <class name="replace_after_this_string">randomtext</class> 
    <class name="not_for_replacing">some other text</class> 
</foo> 

... 다음이 명령을

xmlstarlet ed -u './/class[@name="replace_after_this_string"]' \ 
    -v 'REPLACED HERE' 12477913.xml 

... 다음과 같은 출력을 생성합니다 :

<?xml version="1.0"?> 
<foo> 
    <class name="replace_after_this_string">REPLACED HERE</class> 
    <class name="not_for_replacing">some other text</class> 
</foo> 
2

직접 질문에 답할 수는 없지만 XML을 수정하는 데는 XML을 사용합니다. 파일. 그렇게하면 엔티티 및 문자 인코딩 문제를 피하고 올바른 형식을 유지할 수 있습니다.

명령 줄 XML 툴킷으로 XMLStarlet을 확인해보십시오.

+0

비슷한 라인을 따라 답을 추가해도 상관 없다고 생각합니다. 예를 들어 답을봤을 때 적절한 xmlstarlet 호출을 작성했는데 그걸 버릴 꺼려했습니다. –

+0

@MarkLon 게어 - 전혀. 예제가 가치가 있기 때문에 투표했습니다. –