从 gzip 文件的开头剥离 bash 脚本



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

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

我想出的方法是:

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

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

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

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

我会使用 sed 线范围功能来完成此操作。 -n 禁止正常打印,并且范围/x1fx8b/,$将匹配之后的每一行,包括其中带有 \x1f\x8b 的第一行,并p将它们冲洗掉。

sed -n '/x1fx8b/,$ p'

或者,根据您的喜好,您可以添加文本标记"### 开始 GZIP 数据 ###"并删除之前的所有内容,包括它:

sed '1,/### BEGIN GZIP DATA ###/ d'

Perl 解决方案。它将记录分隔符设置为魔术序列,并打印除第一条记录之外的所有记录。魔术序列必须在开头加上前缀,否则,它将与 bash 脚本一起丢失,这是第一条记录。

perl -ne 'BEGIN { $/ = "x1fx8b"; print $/; } print if $. != 1' input > output.gz

相关内容

  • 没有找到相关文章

最新更新