sed - 使用捕获组打印翻译后的十六进制

sed - print translated HEX using capture group

我想通过在捕获组中隔离 HEX 值来直接打印 sed HEX 值转换。这有效:

echo bbb3Accc | sed -n 's/3A/\x3A/p'
bbb:ccc

...但这不起作用:

echo bbb3Accc | sed 's/\(3A\)/\x/'
bbbx3Accc

...或基于 URL 编码字符串的实际捕获组 REGEX 匹配:

echo bbb%3Accc | sed 's/%\([A-Za-z0-9]\)/\x/'
bbbx3Accc

如果 HEX 值是从 REGEX 捕获组以及 \x 转义符构建的,显然 sed 不再解释和转换 HEX 值。

但我想知道是否有我不知道的解决方法,使它仅适用于 sed。请注意,我知道我可以执行 bash 命令替换并将 sed 语法包装在 echo -e 中,但我想避免这种情况。

如评论中所述,\xAB 由 sed 的解析器解释,而不是作为表达式,因此 \x 不会以您尝试的方式工作。

sed 非常原始,您的示例超出了它的预期目的,因此您最好使用更通用的东西。例如,在 Perl 中:

$ echo bbb3Accc | perl -ple 's/([0-9A-F]{2})/chr(hex())/ge'
bbb:ccc

您的问题不清楚,但也许这就是您尝试使用 GNU awk 进行多字符 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