我正在尝试使用bash在二进制文件中的Y字节之后追加 X个字节。
使用下面的代码似乎工作正常但遇到xFF
时失败(有一个转变)示例:在907字节后追加1字节(xaa)
sed -r -i 's/^.{907}/&"\xaa"/' file.txt
输出(好的时候):
cat file.txt | od -t x1 -t c -Ad
输出(不好的时候):
sed -r -i 's/^.{907}/&"\xaa"/' file_2.txt
cat file_2.txt | od -t x1 -t c -Ad
知道为什么会发生这种情况,以及是否有使用SED的替代方案?
答案 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
仅支持文本文件。我认为这项工作最方便的工具是bbe
(Binary 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