>我有一系列文件,这些文件由一个bash脚本组成,最后连接了一个gzip文件。
我想要一种剥离前导 bash 的方法,留下一个纯 gzip 文件。
我想出的方法是:
- 对文件进行十六进制转储;
- 使用
sed
删除 gzip 幻数之前的所有内容1f 8b
; - 将剩余的十六进制转储转换回二进制。
即
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