2011-02-15 4 views
1

모든 태그를 포함하는 한 줄 파일로 쉘 스크립트를 형식화 된 XML 파일을 사용하여 변환 :나는이 XML 파일을

<content> 
    <tag1> 
      <innertag1>foo</innertag1> 
      <innertag2>baa</innertag2> 
    </tag> 
    <tag2> 
      <innertag1>foo2</innertag1> 
      <innertag2>baa1</innertag2> 
    </tag2> 
</content> 

내가 스크립트를 사용하여, 필요, 동일한 정보와 다른 파일 만 한 줄에 :

<content><tag1><innertag1>foo</innertag1><innertag2>baa</innertag2></tag><tag2><innertag1>foo 2</innertag1><innertag2>baa 1</innertag2></tag2></content> 

grep 및 sed 명령을 사용하려면이 형식이 필요합니다. 내가 어떻게 해?

감사합니다.

+1

그렇지 않습니다. xmlstarlet과 같은 적절한 도구를 사용합니다. –

+0

이것은 좋지만 추가 도구는 사용할 수 없습니다. 주요 도구 만 사용할 수 있습니다. 어쨌든 고마워. – Julian

답변

0
tr -d '\n\t' inputfile > temp && echo >> temp && mv temp inputfile 

또는 sed의 까다로운 버전

sed -in ':a;$s/[\n\t]//g;N;ba' inputfile 

:

sed -n -e ':a' -e '$s/[\n\t]//g' -e 'N' -e 'ba' inputfile > temp && echo >> temp && mv temp inputfile 

다른 옵션 :

perl -i -pe 'chomp unless eof; s/\t//g' inputfile 

또는 가능 :

perl -pe 'chomp unless eof; s/\t//g' inputfile > temp && echo >> temp && mv 

또한 편집하여 입력 파일에서 탭을 제거합니다.

+0

나는 당신의 제안을 시도했지만 sed가 -i는 불법적 인 옵션이라고 말한다. 제거 할 경우 다음 메시지는 ': a; $ s/\ n // g; N; ba'라는 문자가 8자를 초과한다는 것입니다. 어쩌면 이전 버전을 사용하고있을 수도 있습니다. 펄 파일은 제 파일에 아무런 영향을 미치지 않습니다. 어쩌면 다른 버전의 문제 일 수도 있습니다. 마침내 나는 그럭저럭 무엇인가 얻을 수 있었다. 그것은 하나의 라인을 제공하지만 탭으로 인해 나는/t를 또 삭제해야한다고 생각합니다. – Julian

+0

tr 명령에 '\ n'과 '\ t'두 제한을 추가하는 방법이 있습니까? 나는 그것을 단순화하려고 노력하고있다. @Dennis, 그런데 고마워. – Julian

+0

@ Julian :'tr -d '\ n \ t'' (각 문자를 개별적으로 보입니다). 어떤 운영 체제를 사용하고 있습니까? 'sed' 버전의 임시 파일을'tr' 버전과 같은 방식으로 사용해야 할 수도 있습니다. 'sed' 명령은'sed -n -e ': a'-e '$ s/\ n // g'-e 'N'-e 'ba'inputfile> temp와 같아야합니다. '. 미안하지만, 일부 줄 시작 부분에있는 공백을 완전히 간과했습니다. 내 대답을 편집 할게. –

0

평범한 오래된 정규식은 어떻습니까? s/>\s*</></g?

+0

'\ s'는'sed'에 개행 문자를 포함하지 않습니다. –

+0

@Dennis, 예. 나는 PCRE의'\ s'과 그 도구의 사용법 (f.i.와 함께'sed'와 필요한 수정을 가짐)을 의미합니다. 그러나 귀하의 답변은보다 완전하며 스크립트를 제공합니다. –

+0

도와 주셔서 감사합니다. – Julian

관련 문제