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.