1

我有一系列由 bash 脚本组成的文件,最后连接了一个 gzip 文件。

我想要一种剥离前导 bash 的方法,留下一个纯 gzip 文件。

我想出的方法是:

  1. 对文件进行十六进制转储;
  2. 用于sed删除 gzip 幻数之前的所有内容1f 8b
  3. 将剩余的十六进制转储转换回二进制。

IE

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

乍一看,这似乎工作正常。但是,如果文件的 gzip 部分碰巧包含1f 8b除了初始标头之外的字节序列,它就会崩溃。在这些情况下,它会删除最后一次出现之前的所有内容。

我最初的尝试是否在正确的轨道上,我能做些什么来解决它?或者有没有更好的方法来做到这一点,我错过了?

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 回答