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

标签 linux bash sed gzip

我有一系列由 bash 脚本组成的文件,在这些文件的末尾连接了一个 gzip 文件。

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

我想出的方法是:

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

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

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

我最初的尝试是否走在正确的轨道上,我可以做些什么来解决它?还是有我错过的更好的方法?

最佳答案

我会使用 sed 行范围功能来完成此操作。 -n 禁止正常打印,范围 /\x1f\x8b/,$ 将匹配第一行之后的每一行,包括第一行,其中包含\x1f\x8b 和 p将它们打印出来。

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

或者,根据您的喜好,您可以添加文本标记“### BEGIN GZIP DATA ###”并删除之前和包括它的所有内容:

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

关于linux - 从 gzip 文件的开头剥离 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13399348/

相关文章:

linux - Shell 脚本在文件 B 中查找文件 A 的字符串并在特定字符串前面打印 Yes 或 No

bash - 通过 Fly CLI 传递私钥

linux - 使用 bash $ 命令执行 vi

bash - 查找多个文件的公共(public)行

linux - 使用 sed 和 pstree 显示正在使用的终端类型

sql - 如何检查数据库的架构

linux - 如何从文件中求和并以特定方式在 linux 中的另一个文件中移动?

php - PHP 从 5.3.1 升级到 5.3.2 后 session 不起作用

sed - 用另一行替换 3 行 SED 语法

linux - 在脚本中使用 ffmpeg 检测和修复采样率 != 44.1k 的 mp3