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
Другие вопросы по тегам