Why can't sed replace 0x24 byte in binary file?

binary, binaryfiles, hex, replace, sed

Solution

It is because `0x24` is the hex code for the `$` character. Note that `^` and `$` have special meaning in regex (which `sed` uses for matching), and literally means "at the beginning of the line", and "at the end of the line", respectively. As such, those characters are ignored unless escaped. Therefore,

`echo "this and that" | sed 's/this$/cat/'`

will leave the string unchanged because it you're telling sed to look for 'this' at the end of the line -- since 'that' is at the end, it doesn't match. However,

`echo "It costs $50.00." | sed 's/\$50\.00/47.00 Swiss Francs/'`

Will change the line as expected because the `$` was escaped. For binary data, just include the hex code for the `\` character (`\x5c`) just prior to `\x24` in the regex section, and it should work just fine.

Cheers.

Problem

I'm want to replace some bytes in binary file to another. Created sample (6 bytes long) file via ``` echo -ne '\x8f\x15\x42\x02\x24\xc2' > test ``` Then tried to replace bytes \x15\x42\x02 to \x12\x12\x02 via sed: ``` sed 's \x15\x42\x02 \x12\x12\x02 g' test > test1 ``` sed replaced bytes: ``` cat test test1 | xxd -c 6 0000000: 8f15 4202 24c2 ..B.$. 0000006: 8f12 1202 24c2 ....$. ^^ ^^^^ ``` Tried then replace bytes \x42\x02\x24 to \x12\x02\x24: ``` sed 's \x42\x02\x24 \x12\x02\x24 g' test > test2 ``` sed NOT replaced bytes: ``` cat test test2 | xxd -c 6 0000000: 8f15 4202 24c2 ..B.$. 0000006: 8f15 4202 24c2 ..B.$. ^^^^ ^^ ``` What's wrong? I have sed (GNU sed) 4.2.2 (Kubuntu 13.10) Thank You.

Original source