I'm having some trouble getting sed to do a find/replace of some hex characters. I want to replace all instances within a file of the following hexadecimal string:
0x0D4D5348
with the following hexadecimal string:
0x0D0A4D5348
How can I do that?
EDIT: I'm trying to do a hex find/replace. The input file does not have the literal value of "0x0D4D5348" in it, but it does have the ASCII representation of that in it.
GNU sed v3.02.80, GNU sed v1.03, and HHsed v1.5 by Howard Helman
all support the notation \xNN
, where "NN" are two valid hex numbers, 00-FF.
Here is how to replace a HEX sequence in your binary file:
$ sed 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x53\x48/g' file > temp; rm file; mv temp file
As @sputnik pointed out, you can use sed's in place
functionality. One caveat though, if you use it on OS/X, you'd have to add an empty set of quotes:
$ sed '' 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x53\x48/g' file
As sed in place
on OS/X takes a parameter to indicate what extension to add to the file name when making a backup, since it does create a temp file first. But then.. OS/X's sed
doesn't support \x
.
This worked for me on Linux and OSX.
Replacing in-place:
sed -i '.bk' 's'/`printf "\x03"`'/foo/g' index.html
(See @Ernest's comment in the answer by @tolitius)
In OS/X system's Bash, You can use command like this:
# this command will crate a variable named a which contains '\r\n' in it
a=`echo -e "hello\r\nworld\r\nthe third line\r\n"`
echo "$a" | sed $'s/\r//g' | od -c
and now you can see the output characters :
0000000 h e l l o \n w o r l d \n t h e
0000020 t h i r d l i n e \n
0000033
You should notice the difference between 's/\r//g'
and $'s/\r//g'
.
Based on the above practices, you can use command like this to replace hex String
echo "$a" | sed $'s/\x0d//g' | od -c
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With