Подтвердить что ты не робот

Hex String Replacement Использование sed

У меня возникают проблемы с получением sed для поиска/замены некоторых шестнадцатеричных символов. Я хочу заменить все экземпляры в файле следующей шестнадцатеричной строки:

0x0D4D5348

со следующей шестнадцатеричной строкой:

0x0D0A4D5348

Как я могу это сделать?

EDIT: Я пытаюсь выполнить hex find/replace. Входной файл не имеет буквального значения "0x0D4D5348" в нем, но он имеет представление ASCII того, что в нем.

4b9b3361

Ответ 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