0

wget を使用して XML ファイルをダウンロードしていますが、ファイルの最初の行にテキストを削除する必要がある場合があります。

現在、最初の行に「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>
4

3 に答える 3

1

これはあなたがなりたい場所にあなたを連れて行くかもしれないと思います。

sample.xmlのwgetを実行したとすると、次のようになります。

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

これにより、ファイルの先頭から<以外のもの、およびファイルの末尾から>以外のものがすべて削除されます。

于 2012-11-25T18:06:58.740 に答える
1

の仕事ですsedあなたはより速く、より簡単に見つけることができません:

2 つの値に確信がある場合は、次のように簡単に実行できます。

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

ただし、次のコマンドsedを使用すると、数字のみを含む最初および/または最後の行が削除されます。

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

これは、ファイルを param として実行し、バックアップ ファイルを自動生成することで実行できます。

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

説明:

  • 2 つの部分があり、1最初の行と最後の行のアドレスです。$1$
  • 次のブロックは、条件付きアドレスの別の形式を示しています。つまり、 と/^[0-9]\+$/の間の 1 つまたは複数の文字で始まり、その直後で終わる * 行を意味します。09
  • この一致する行 (最初または最後の行) で、実行するコマンドはddelete lineです。

これは次のように記述できます。

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は分岐 (ジャンプ) 先のラベルです
  • baとはそれぞれとbbに分岐命令です。:a:b
  • 1および$アドレスは前述のとおりです
  • /.../dも以前に説明されていますが、正規表現に一致する行を削除することを意味します

そして、次のように書くことができます:

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

s/../../only の代わりに使用するアプリケーションのサンプルd: 1 行目または最後の行にある場合にのみバージョン情報を変更します。

 sed -e '1ba;$ba;bb;:a;s/\(Id: .*,v\).*\(Exp\)/\1'"$(
             date +" $VER %F %T $USER ")"'\2/;b;' -i files*
于 2012-11-25T18:19:46.083 に答える
0

wget --save-headersコメントに基づいて、適切な HTTP 応答パーサーを使用して使用したいと考えています。それは実際には非常に簡単です:

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

を介してヘッダーを含む応答が与えられると$raw_response、上記のコードは、送信された XML (または任意の) ドキュメントを に返します$body


元の応答:

これは、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, '');
   }
}
于 2012-11-24T19:35:33.003 に答える