Hex String Replacement Использование sed
У меня возникают проблемы с получением sed для поиска/замены некоторых шестнадцатеричных символов. Я хочу заменить все экземпляры в файле следующей шестнадцатеричной строки:
0x0D4D5348
со следующей шестнадцатеричной строкой:
0x0D0A4D5348
Как я могу это сделать?
EDIT: Я пытаюсь выполнить hex find/replace. Входной файл не имеет буквального значения "0x0D4D5348" в нем, но он имеет представление ASCII того, что в нем.
Ответы
Ответ 1
GNU sed v3.02.80, GNU sed v1.03 и HHsed v1.5 от Howard Helman
все поддерживают обозначение \xNN
, где "NN" - два действительных шестнадцатеричных числа, 00-FF.
Вот как заменить последовательность HEX в вашем двоичном файле:
$ sed 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x53\x48/g' file > temp; rm file; mv temp file
Как отметил @sputnik, вы можете использовать функцию sed in place
. Однако, если вы используете его в OS/X, вам нужно добавить пустой набор кавычек:
$ sed '' 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x53\x48/g' file
Так как sed in place
в OS/X принимает параметр, чтобы указать, какое расширение следует добавлять к имени файла при создании резервной копии, поскольку он сначала создает временный файл. Но тогда.. OS/X sed
не поддерживает \x
.
Ответ 2
Это работало для меня в Linux и OSX.
Замена на месте:
sed -i '.bk' 's'/`printf "\x03"`'/foo/g' index.html
(См. комментарий @Ernest в ответе @tolitius)
Ответ 3
В операционной системе Bash OS/X вы можете использовать такую команду:
# 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
и теперь вы можете увидеть выходные символы:
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
Вы должны заметить разницу между 's/\r//g'
и $'s/\r//g'
.
Исходя из вышеизложенного, вы можете использовать такую команду для замены шестнадцатеричной строки
echo "$a" | sed $'s/\x0d//g' | od -c