2013-04-30 2 views
0

쉘 스크립팅 및 자동화 작업을하고 있습니다. 더 많은 코드를 작성하지 않고도 cetain 작업을 수행하고 싶습니다.sed를 사용하여 파일에서 n 어커런스를 바꾸는 방법은 무엇입니까?

아래는 웹 서비스의 샘플 xml입니다. 요청 (Data.xml) 아래의 각 세그먼트에서 시작일이 바뀌기를 원합니다.

첫 번째 호출에서 첫 번째 태그의 시작 날짜 만 수정되고 나머지 시작 날짜는 변경되지 않습니다.

내 접근 방식은 모든 줄 바꿈을 제거하고 한 줄로 전체 XML을 형성 한 다음 sed를 사용하여 원하는 발생을 대체했습니다.

<Data> 
<First> 
<Name>Micheal</Name> 
<Account-Validation> 
<startdate>01011970</startdate> 
<enddate>01019999</enddate> 
</Account-Validation> 
</First> 
<Second> 
<Name>Adam</Name> 
<Account-Validation> 
<startdate>01011979</startdate> 
<enddate>01019999</enddate> 
</Account-Validation> 
</Second> 
<Third> 
<Name>Raul</Name> 
<Account-Validation> 
<startdate>01011970</startdate> 
<enddate>01019999</enddate> 
</Account-Validation> 
</Third> 
</Data> 

제가 그것이 전체 XML 포맷을 변경하는 것을 볼 수있는 유일한 문제 :

제가

명령 아래
cat Data.xml | awk '{ print $1}'| xargs echo | sed 's/<startdate>01011970<\/startdate>/<startdate>01011979<\/startdate>/2' | sed 's/> </>\n</g' 

출력을 이용하여 시험해 보았다. 그래서 내가 보류 버퍼 및 패턴 버퍼 접근 방식을 사용하여 동일한 찾고 있어요. 여기,

cat Data.xml | sed '{/<Second>/,/<\/Second>/g;s/<startdate>01011970<\/startdate>/<startdate>01011979<\/startdate>/p};h; 

샘플 명령입니다하지만 위의 방법으로 문제가 해결되지 않기 때문에 어떤 일이 사용 보류 버퍼와 패턴 버퍼 접근을하는 데 도움이 있습니다. 이 접근 방식을 사용하는 이점은 발생 횟수를 세지 않아도되므로 시작할 날짜의 태그 이름 만 쉽게 바꿀 수 있습니다.

인 data.xml

<Data> 
     <First> 
         <Name>Micheal</Name> 
         <Account-Validation> 
           <startdate>01011970</startdate> 
           <enddate>01019999</enddate> 
         </Account-Validation> 
     </First> 
     <Second> 
         <Name>Adam</Name> 
         <Account-Validation> 
           <startdate>01011970</startdate> 
           <enddate>01019999</enddate> 
         </Account-Validation> 
     </Second> 
     <Third> 
         <Name>Raul</Name> 
         <Account-Validation> 
           <startdate>01011970</startdate> 
           <enddate>01019999</enddate> 
         </Account-Validation> 
     </Third> 
</Data> 

감사합니다, Priyank 샤

+0

XML 데이터를 수정하는 데 XSLT를 사용하는 것이 좋습니다. 문자열 바꾸기를 사용하면 종종 복잡한 패턴이 생겨 항상 작동하지 않을 수 있습니다. – beny23

답변

1

되어 작동하지 않는 명령의 이유 : 당신이 제대로 주소 공간을 선택하지만, 그것으로 아무것도하지 않습니다. 's'명령은 주소 공간 안에 있어야합니다.

예 :

sed '/<Second>/,/<\/Second>/{s/<startdate>01011970<\/startdate>/<startdate>01011979<\/startdate>/}' Data.xml 

{} 중괄호 당신이 여기처럼 하나의 명령을 실행할 때 선택 사항입니다.

+0

완료 ... 감사 친구 ... :) –

관련 문제