sed - печатать переведенный HEX используя группу захвата
Я хотел бы напечатать непосредственно с sed
преобразование значений HEX путем выделения значений HEX в группах захвата. Это работает:
echo bbb3Accc | sed -n 's/3A/\x3A/p'
bbb:ccc
... но это не работает:
echo bbb3Accc | sed 's/\(3A\)/\x\1/'
bbbx3Accc
... или фактическое совпадение с REGEX для группы захвата на основе строк в кодировке URL:
echo bbb%3Accc | sed 's/%\([A-Za-z0-9]\)/\x\1/'
bbbx3Accc
Очевидно, sed больше не интерпретирует и не переводит значение HEX, если оно создано из группы захвата REGEX вместе с \x
побег.
Но мне интересно, есть ли обходной путь, о котором я не знаю, чтобы сделать эту работу только с sed
, Обратите внимание, что я знаю, что могу выполнить подстановку команд bash и обернуть синтаксис sed в echo -e
но я бы хотел этого избежать.
2 ответа
Ваш вопрос не ясен, но, возможно, это то, что вы пытаетесь сделать, используя GNU awk для multi-char RS, RT и strtonum():
$ echo 'bbb%3Accc%21ddd' |
gawk -v RS='%[[:xdigit:]]{2}' 'sub(/%/,"0x",RT){RT=sprintf("%c",strtonum(RT))} {ORS=RT} 1'
bbb:ccc!ddd
Как упоминалось в комментариях, \xAB интерпретируется синтаксическим анализатором sed, а не как выражение, поэтому \ x не будет работать так, как вы пытались.
sed довольно примитивен, и ваш пример выходит за рамки того, для чего он предназначен, поэтому вам лучше использовать что-то более общее. Например, в Perl:
$ echo bbb3Accc | perl -ple 's/([0-9A-F]{2})/chr(hex($1))/ge'
bbb:ccc