我有一个二进制文件,我使用 hexdump 和一些 awk 和 sed 命令将其转换为常规文件。输出文件看起来像这样 -
$cat temp
3d3d01f87347545002f1d5b2be4ee4d700010100018000cc57e5820000000000000000000
000000087d3f513000000000000000000000000000000000001001001010f000000000026
58783100b354c52658783100b43d3d0000ad6413400103231665f301010b9130194899f2f
fffffffffff02007c00dc015800a040402802f1d5b2b8ca5674504f433031000000000004
6363070000000000000000000000000065450000b4fb6b4000393d3d1116cdcc57e58287d
3f55285a1084b
临时文件很少有吸引眼球的地方 (3d3d),它们不会经常重复。它们有点表示新二进制记录的开始。我需要根据这些吸引眼球的地方拆分文件。
我想要的输出是有多个文件(基于我的临时文件中吸引眼球的数量)。
所以我的输出看起来像这样 -
$cat temp1
3d3d01f87347545002f1d5b2be4ee4d700010100018000cc57e582000000000000000
0000000000087d3f513000000000000000000000000000000000001001001010f00000000
002658783100b354c52658783100b4
$cat temp2
3d3d0000ad6413400103231665f301010b9130194899f2ffffffffffff02007c00dc0
15800a040402802f1d5b2b8ca5674504f4330310000000000046363070000000000000000
000000000065450000b4fb6b400039
$cat temp3
3d3d1116cdcc57e58287d3f55285a1084b
最佳答案
awk
中的 RS
变量对此非常有用,它允许您定义记录分隔符。因此,您只需要在其自己的临时文件中捕获每条记录。最简单的版本是:
cat temp |
awk -v RS="3d3d" '{ print $0 > "temp" NR }'
示例文本以引人注目的 3d3d
开头,因此 temp1 将是一个空文件。此外,引人注目的本身不会出现在临时文件的开头,如问题中的临时文件所示。最后,如果有很多记录,您可能会遇到系统打开文件的限制。一些小的并发症会使它更接近您想要的并使其更安全:
cat temp |
awk -v RS="3d3d" 'NR > 1 { print RS $0 > "temp" (NR-1); close("temp" (NR-1)) }'
关于bash - 根据模式将一个文件拆分为多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8061475/