SED:在特定字节位置后追加额外字节

时间:2016-08-09 10:35:41

标签: bash sed

我正在尝试使用bash在二进制文件中的Y字节之后追加 X个字节。

使用下面的代码似乎工作正常但遇到xFF

时失败(有一个转变)

示例:在907字节后追加1字节(xaa)

sed -r -i 's/^.{907}/&"\xaa"/' file.txt

输出(好的时候):

cat file.txt | od -t x1 -t c -Ad

OK output

输出(不好的时候):

sed -r -i 's/^.{907}/&"\xaa"/' file_2.txt
cat file_2.txt | od -t x1 -t c -Ad

NOT ok - Shift in the output

知道为什么会发生这种情况,以及是否有使用SED的替代方案?

2 个答案:

答案 0 :(得分:3)

在我看来,使用sed编辑二进制流并不是一个好主意。 通常,您在十六进制转储中转换二进制流,进行编辑 并将其转换回来。

就像那样:

$ hexdump -ve '1/1 "%.2X"' file1 \
| sed -r 's/^.{1814}/&aa/' \
| xxd -r -p > file2

您也可以使用Perl代替xxd

| perl -e 'print pack "H*", <STDIN>'

答案 1 :(得分:0)

正如其他地方提到的sed仅支持文本文件。我认为这项工作最方便的工具是bbeBinary Block Editor),它与sed非常相似,但对二进制数据起作用。

首先使用-b开关定义要编辑的块,在您的情况下为-b 907:1,有关更多选项,请参阅the manual中的第3页和第4页。现在告诉bbe在您的情况下使用-e开关,A \xaa在块上运行哪些命令,请参阅the manual中的第5-8页以获取更多命令。

合在一起:

bbe -b 907:1 -e 'A \xaa' file.txt > modified_file.txt

将整个文件用作块的另一个例子:

bbe -e 'i 907 \xaa' file.txt > modified_file.txt