2015-01-30 2 views
0

올바른 태그를 식별 한 후에 XML의 한 행을 교체하려고합니다.Sed가 XML에서 일치 한 후에 전체 행을 바꿉니다.

내가 밥과 를 교체 앤드류 싶습니다

<root> 
    <My_Name>Andrew</My_Name> 
    <My_Age>94</My_Age> 
</root> 

을 가지고

이것은

sed -i 's/<My_Name>.*</My_Name>/<My_Name>$nameVariable</My_Name>/g' 

밥이 나오지 사용하여 $ nameVariable

에 저장됩니다

, prob 어쩔 수없이 이스케이프 문자가 없기 때문에 실패했습니다. 나는 여러 장소에 퍼팅을 시도했지만 올바른 결과를 얻지 못했습니다. 도움을 많이 주시면 감사하겠습니다.

+0

사용 따옴표가 변수 확장은'/', 내 게시물을 참조 탈출. – Jotne

답변

0

awk 작동 할 수 있습니다

awk -v name="$nameVariable" '/<My_Name>/{sub(/>.*</,">"name"<")}1' file 
<root> 
    <My_Name>Bob</My_Name> 
    <My_Age>94</My_Age> 
</root> 

sed를 해결하려면. 일부 그래서 당신은 텍스트를 두 번하지 않아도 큰 따옴표를 사용하고 /

sed -i "s/<My_Name>.*<\/My_Name>/<My_Name>$nameVariable<\/My_Name>/g" file 
<root> 
    <My_Name>Bob</My_Name> 
    <My_Age>94</My_Age> 
</root> 

당신은 변경할 수 있습니다 탈출 :

sed -i -r "s|(<My_Name>).*(</My_Name>)|\1$nameVariable\2|g" file 

-r 그래서 나는 ()을 탈출 할 필요가 없습니다.
/|으로 바꾸고 /의 이스케이프가 필요하지 않습니다.

+0

정확히 내가 찾고있는 곳! 고맙습니다! – Marty

+0

@ Marty 오신 것을 환영합니다. 일부 게시물이 업데이트되었습니다. – Jotne

0

sed는 XML을 편집하기위한 좋은 도구가 아닙니다. 어떤 방법 으로든 잘못된 위치에 줄 바꿈이 있거나 빈 태그가 있거나 중첩 된 태그가 있거나 거대한 규모의 다른 경우에 중단됩니다.

XML을 올바르게 구문 분석하는 도구를 사용하십시오. xmlstarlet와 예를 들어 :

xmlstarlet ed -u '/root/My_Name' -v "$nameVariable" filename.xml 
+0

해답을 가져 주셔서 감사합니다! 그래도 스크립트는 sed가 사용할 수있는 도구이고 다른 것은 부과 할 수없는 여러 컴퓨터에서 실행됩니다. 원본 XML의 형식은 엄격하게 부과되며 위험을 감수합니다. – Marty

0

정규식을 사용하여 XML을 처리하지 마십시오. 적절한 XML 처리 도구를 사용하십시오. 예를 들어, 나는 xsh를 사용

스크립트는 :

open file.xml ; 
set /root/My_Name { $ARGV[0] } ; 
save :b ; 

호출 :

xsh script.xsh "$nameVariable" 
관련 문제