2012-11-24 1 views
0

wget을 사용하여 XML 파일을 다운로드하고 있지만 언젠가는 파일을 제거해야하는 첫 줄에 텍스트가 있습니다.PERL을 사용하여 XML 파일의 첫 번째 줄을 지우는 경우에만 "XYZ"가 포함되어 있습니다

현재 첫 번째 줄에는 "131"이 있고 마지막 줄에는 "0"이 있습니다.

이 정보가 포함되어 있으면이 줄을 제거하는 방법이 필요합니다. perl 찾기 및 바꾸기를 수행 할 수 없지만 적절한 경우 첫 줄에 "131"이 포함됩니다.

의미가 있습니까?

아이디어가 있으십니까?

감사

예, 때로는 이것이다 :

131 
<element> 
<example>content</example> 
<example>content</example> 
<example>content</example> 
<example>content</example> 
</element> 
0 

그것은

<element> 
<example>content</example> 
<example>content</example> 
<example>content</example> 
<example>content</example> 
</element> 
+3

두 번째 파일이 오히려 많은 코드를 작성하는 것보다, 그냥 빨리 예이고, 하나 개의 루트 요소 – Mark

+0

안녕하세요있을 필요하거나 XML이 아니다. –

+1

파일 또는 HTTP 응답을 처리하고 있습니까? 그것은 "chunked"HTTP 응답입니다. – ikegami

답변

1

sed의 직업입니다. 당신은 더 빨리 또는 더 간단 찾을 would'nt :

당신이 두 값의 확신 경우

, 당신은 단순히 수 :

sed -e '1{/^131$/d};${/^0$/d}' -i mybrokenfile 

그러나 다음 명령 파크

, sed동안 제거 어떤 제/또는 마지막 줄은 숫자를 포함 :

sed -e '1{/^[0-9]\+$/d};${/^[0-9]\+$/d}' 

이 수 PARAM 같은 파일 및 백업 파일 자동 생성과 실행의 :

는 설명 :

  • 두 부분으로,이 1$주소 있습니다 : 첫 번째 라인에 대한 1$ 마지막 줄에.
  • 다음 블록은 09 사이의 하나 이상의 문자로 시작하여 그 직후에 끝나는, 주소 별 조건의 다른 형태 인 /^[0-9]\+$/을 의미합니다.
  • 이 일치하는 줄 (첫 번째 줄 또는 마지막 줄)에서 실행할 명령은 의 경우 d입니다.

이를 쓸 수있다 :

sed -e '1{ 
      /^[0-9]\+$/d 
     } 
     ${ 
      /^[0-9]\+$/d 
     }' -i.bak files* 

을뿐만 아니라.

편집 :

내가 ... 약 아무것도 이상의 시간을 쓰기 싫어으로;

몇 가지 까다로운 작업을 수행하는 방법이 있지만 첫 번째 줄과 마지막 줄에만 있습니다.

첫째, 동일한 샘플 작성에 의해 수 :

sed -e '1ba;$ba;bb;:a;/^[0-9]\+$/d;:b;' -i.bak files* 

을 그래서이 1 바이트 짧은! 그러나 특히 작업 한 번만 기록됩니다

는 설명 :

  • :a:b
  • babb 분기 할 레이블 (점프)되어있는 지점 instruvtion을 각각 :a:b에.사용하여 응용 프로그램의

    sed -e ' 
        1ba; 
        $ba; 
        bb; 
        :a; 
        /^[0-9]\+$/d; 
        :b; 
        ' -i.bak files* 
    

    샘플 : 이전

  • /.../d
  • 이전에 너무 설명 설명
  • 1$정규식

일치하는 라인을 삭제하고 쓴 수있는 의미, 주소입니다 s/../../ 대신 d : 버전 정보 수정 LY 1 또는 마지막 줄에있는 경우 :

sed -e '1ba;$ba;bb;:a;s/\(Id: .*,v\).*\(Exp\)/\1'"$(
      date +" $VER %F %T $USER ")"'\2/;b;' -i files* 
0

의견을 바탕으로 (올바른)과 같이 때때로, 당신은 wget --save-headers 및 사용을 사용하려면 적절한 HTTP 응답 파서. 즉 실제로는 매우 간단합니다 : $raw_response를 통해 헤더를 포함한 응답을 감안할 때

use HTTP::Response qw(); 
my $response = HTTP::Response->parse($raw_response); 
my $body = $response->decoded_content(charset => 'none'); 

은, 위의 코드는 $body에 전송 된 XML (또는 무엇이든) 문서를 반환합니다.


원래 응답 : HTTP 응답을 청크의

.

if ($file =~ /^[0-9]+\r?\n/) { 
    my $chunked = substr($file, 0, length($file), ''); 
    for (;;) { 
     $chunked =~ s/^([0-9]+)\r?\n// 
     or die; 

     my $chunk_len = $1 
     or last; 

     length($file) >= $chunk_len 
     or die; 

     $file .= substr($chunked, 0, $chunk_len, ''); 
    } 
} 
+0

안녕하세요, ikegami, 답장을 보내 주셔서 감사합니다. 예, wget을 사용하여 HTTP에서 피드를 가져옵니다. cronjob으로 코드를 사용할 수있는 방법이 있습니까? 한 줄에 코드를 사용하고 cron을 통해 실행할 수 있습니까? –

+0

wget이 응답 본문 대신 원시 응답을 다시 돌려주는 이유는 무엇입니까? – ikegami

+0

매우 긴 줄이긴하지만, 한 줄짜리 또는 'cron'으로 실행되는 것을 막을 특별한 것은 없습니다. – ikegami

1

나는 이것이 당신이되고 싶은 곳으로 데려다 줄 수 있다고 생각합니다.

그냥 다음 sample.xml에 대한 wget을했다 치죠 : 파일의 끝에서 파일 및 아무것도 시작하지>에서 비 아무것도 < 스트립

perl -pi -e '$/ = undef; s{(?: \A [^<]* | [^>]* \z)}{}xmsg;' sample.xml 

.

관련 문제