我有一系列由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
,它就会崩溃。在这些情况下,它会在 last 出现之前删除所有内容。
我最初的尝试是否在正确的轨道上,我该怎么做才能解决它?还是有一个更好的方法可以做到这一点我错过了吗?
答案 0 :(得分:2)
Perl解决方案。它将记录分隔符设置为魔术序列并打印除第一个记录之外的所有记录。魔术序列必须在开头添加,否则,它将与bash脚本一起丢失,这是第一个记录。
perl -ne 'BEGIN { $/ = "\x1f\x8b"; print $/; } print if $. != 1' input > output.gz
答案 1 :(得分:2)
我会使用sed行范围功能来实现这一目标。 -n
会阻止正常打印,范围/\x1f\x8b/,$
将匹配第一个包含\ x1f \ x8b的第一个行,p
将它们拉出来。
sed -n '/\x1f\x8b/,$ p'
或者,根据您的喜好,您可以添加文本标记“### BEGIN GZIP DATA ###”并删除之前的所有内容:
sed '1,/### BEGIN GZIP DATA ###/ d'