按管道中的地址更改字节范围

按管道中的地址更改字节范围

我有一些二进制数据正在通过 Bash 管道传输。数据大小通常超过 50MB。

现有的代码大致如下

inputprocess | filter1 | filter2 | filter3 > result.txt

我知道流中第一个过滤器后的 30000-30099 字节处有坏值。我知道这些值应该是什么。我只需要用好字节替换坏字节。数据长度没有变化。

如果这是基于行的,我会使用类似的东西:

inputprocess | filter1 | sed -e'SOMETHING' | filter2 | filter2 > result.txt

然而,我不确定sed在处理二进制数据时应该用什么来代替。

答案1

sed是面向行的,不太适合处理二进制数据的问题。但是,headtail可以工作:

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

相关内容