我有一些二进制数据正在通过 Bash 管道传输。数据大小通常超过 50MB。
现有的代码大致如下
inputprocess | filter1 | filter2 | filter3 > result.txt
我知道流中第一个过滤器后的 30000-30099 字节处有坏值。我知道这些值应该是什么。我只需要用好字节替换坏字节。数据长度没有变化。
如果这是基于行的,我会使用类似的东西:
inputprocess | filter1 | sed -e'SOMETHING' | filter2 | filter2 > result.txt
然而,我不确定sed
在处理二进制数据时应该用什么来代替。
答案1
sed
是面向行的,不太适合处理二进制数据的问题。但是,head
和tail
可以工作:
inputprocess | filter1 | { head -c29999 ; echo -n "replacement" ; tail -c+100 ; } | filter2 | filter3 > result.txt
head -c29999
将前 29,999 个字节回显到 stdout。然后将替换文本发送到 stdout。然后,tail -c+100
跳过接下来的 100 个字节输入(您想要替换的字节)并将其余部分复制到 stdout。
假设head
只读取了必要的内容,此命令有效。此命令在 GNU 下有效head
。然而,在非 Linux 系统上,可能需要检查head
命令是否贪婪。
答案2
如果您想采用 sed(1) 路线,您可能还需要将 hexdump(1) 和 xxd(1) 添加到管道:
$>echo Hello | hexdump -ve '1/1 "%.2X"' | sed 's/48656C6C6F/476F6F64627965/' | xxd -r -p
Goodbye