1

bash スクリプトで構成される一連のファイルがあり、最後に gzip ファイルが連結されています。

先頭の bash を取り除き、純粋な gzip ファイルを残す方法が欲しいです。

私が思いついた方法は次のとおりです。

  1. ファイルで 16 進ダンプを実行します。
  2. sedgzip マジック ナンバーより前のすべてを削除するために使用し1f 8bます。
  3. 残りの 16 進ダンプをバイナリに変換します。

すなわち

xxd -c1 -p input | tr "\n" " " | sed 's/^.*?1f 8b/1f 8b' | xxd -r -p > output

これは一見問題ないように見えます。1f 8bただし、ファイルの gzip 部分に最初のヘッダーとは別にバイト シーケンスが含まれていると、バラバラになります。このような場合、最後に出現する前のすべてを削除します。

私の最初の試みは正しい軌道に乗っていますか?それを修正するにはどうすればよいですか? または、私が見逃したこれを行うためのより良い方法はありますか?

4

2 に答える 2

2

Perlソリューション。レコードセパレータをマジックシーケンスに設定し、最初のレコードを除くすべてのレコードを印刷します。マジックシーケンスは最初に先頭に追加する必要があります。そうしないと、最初のレコードであるbashスクリプトと一緒に失われます。

perl -ne 'BEGIN { $/ = "\x1f\x8b"; print $/; } print if $. != 1' input > output.gz
于 2012-11-15T14:41:53.190 に答える
2

これを実現するには、sed 回線範囲機能を使用します。-n通常の印刷を抑制し、範囲/\x1f\x8b/,$は \x1f\x8b を含む最初の行以降のすべての行に一致し、印刷pします。

sed -n '/\x1f\x8b/,$ p'

または、好みに応じて、テキスト マーカー「### BEGIN GZIP DATA ###」を追加し、それ以前およびそれを含むすべてを削除することもできます。

sed '1,/### BEGIN GZIP DATA ###/ d'
于 2012-11-15T16:56:31.810 に答える