Замена Hex String с помощью sed

17

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

0x0D4D5348

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

0x0D0A4D5348

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

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

    
задан Carter 13.10.2011 в 23:37
источник

2 ответа

26

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 принимает параметр , чтобы указать, какое расширение следует добавлять к имени файла при создании резервной копии, так как он создает файл temp. Но тогда .. OS / X sed не поддерживает \x .

    
ответ дан tolitius 13.10.2011 в 23:40
  • Я ценю тщательный ответ, но, я думаю, я был не совсем ясен. Я хочу в основном заменить окончания строки 0x0D на 0x0D0A, однако я хочу только заменить окончания строки, где начало следующей строки содержит символы «MSH» (0x4D5348 в шестнадцатеричном формате). Это имеет смысл? –  Carter 14.10.2011 в 00:14
  • Лучше отредактировать исходное сообщение, чем ожидать, что другие читатели прочитают все комментарии, пытаясь найти вашу пересмотренную спецификацию. Удачи! –  shellter 14.10.2011 в 00:30
  • Спасибо за подсказку. Вопрос пересмотрен. –  Carter 14.10.2011 в 00:32
  • добавлено примечание о двоичных значениях –  tolitius 14.10.2011 в 04:16
  • Поскольку sed в OS X не поддерживает \ x, существует ли другой способ сделать это, который будет работать в OS X? –  Ernest 27.08.2016 в 05:53
2

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

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

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

(См. комментарий @ Ernest в ответе @tolitius)

    
ответ дан Andrew E 05.11.2016 в 05:07
  • древний - относительный термин ... это помогло мне поблагодарить вас. –  ojblass 01.02.2017 в 19:06