Замена шестнадцатеричной строки при помощи sed - PullRequest
22 голосов
/ 14 октября 2011

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

0x0D4D5348

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

0x0D0A4D5348

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

РЕДАКТИРОВАТЬ: я пытаюсь сделать шестнадцатеричное найти / заменить. Во входном файле нет буквального значения «0x0D4D5348», но в нем есть ASCII-представление.

Ответы [ 3 ]

30 голосов
/ 14 октября 2011

GNU sed v3.02.80, GNU sed v1.03 и HHsed v1.5 Говард Хелман все поддерживают обозначение \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, вы можете использовать in place функциональность sed. Одно предостережение: если вы используете его в OS / X, вам придется добавить пустой набор цитат:

$ sed '' 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x53\x48/g' file

Как и sed in place в OS / X принимает параметр , чтобы указать, какое расширение добавить к имени файла при создании резервной копии, поскольку сначала создает временный файл , Но тогда .. sed OS / X не поддерживает \x.

3 голосов
/ 05 ноября 2016

Это сработало для меня в Linux и OSX.

Замена на месте:

sed -i '.bk' 's'/`printf "\x03"`'/foo/g' index.html

(См. Комментарий @ Эрнеста в ответе @tolitius)

2 голосов
/ 03 марта 2019

В 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
...