使用awk printf对文本进行URL解码

使用awk printf对文本进行URL解码,awk,printf,urldecode,busybox,Awk,Printf,Urldecode,Busybox,我正在使用awk解码一些文本 如果我将字符串编码到printf语句中,如printf“%s”、“\x3D”,它将正确地输出=。如果我将整个转义字符串作为变量,也是一样的 但是,如果我只有3D,我如何附加\x,以便printf将打印=,而不是\x3D 我使用的是busybox awk 1.4.2和ashshell。我不知道如何在awk中实现这一点,但在perl中它很简单: echo "http://example.com/?q=foo%3Dbar" | perl -pe 's/\+/ /

我正在使用
awk
解码一些文本

如果我将字符串编码到
printf
语句中,如
printf“%s”、“\x3D”
,它将正确地输出
=
。如果我将整个转义字符串作为变量,也是一样的

但是,如果我只有
3D
,我如何附加
\x
,以便
printf
将打印
=
,而不是
\x3D


我使用的是
busybox awk 1.4.2
ash
shell。

我不知道如何在awk中实现这一点,但在perl中它很简单:

echo "http://example.com/?q=foo%3Dbar" | 
    perl -pe 's/\+/ /g; s/%([0-9a-f]{2})/chr(hex($1))/eig'

因为您使用的是ash,而Perl不可用,所以我假设您可能没有
gawk

对于我来说,使用
gawk
busybox awk,您的第二个示例与第一个示例的工作原理相同(我从两个示例中获得“=”),除非我使用
--posix
选项(在这种情况下,我从两个示例中获得“x3D”)

如果我将
--非十进制数据
--传统数据
gawk
一起使用,我会得到“=”

您使用的AWK版本是什么(
AWK
nawk
gawk
,busybox-和版本号)

编辑:

可以通过添加零将变量的字符串值强制为数字值:

~/busybox/awk 'BEGIN { string="3D"; pre="0x"; hex=pre string; printf "%c", hex+0}'

这依赖于gnu awk对split函数的扩展,但这是可行的:

gawk '{ numElems = split($0, arr, /%../, seps);
        outStr = ""
        for (i = 1; i <= numElems - 1; i++) {
            outStr = outStr arr[i]
            outStr = outStr sprintf("%c", strtonum("0x" substr(seps[i],2)))
        }
        outStr = outStr arr[i]
        print outStr
      }'
gawk'{numElems=split($0,arr,/%../seps);
outsr=“”
对于(i=1;iGNU awk

!/usr/bin/awk-fn
@包括“作战需求文件”
开始{
RS=“%”
}
{
printf RT?$0 chr(“0x”substr(RT,2)):$0
}


首先,我知道这是一个老问题,但没有一个答案对我有效(仅限于busybox awk)

两个选项。要解析stdin:

awk '{for (y=0;y<127;y++) if (y!=37) gsub(sprintf("%%%02x|%%%02X",y,y), y==38 ? "\\&" : sprintf("%c", y));gsub(/%25/, "%");print}'

awk'{for(y=0;yThanks,但perl不可用。@zwol只有在用反斜杠转义
+
的情况下,这才适用于perl 5!顺便说一句,对于没有
s/\+//g
部分的示例URL,对我来说效果很好!仅使用第二个正则表达式就已经可以了。@syntaxerror您对需要转义的
+
非常正确,不知道吗我真的错过了。我想自从我写这篇文章以来,q=短语+分隔+加+符号
符号已经不那么常见了,但它仍然是表单提交逃避的一部分。哦,你是对的,我忘记了那些表单提交。然而,因为我的主要目标是修复“乱码”下载链接,最重要的是从一开始就摆脱所有这些
%20
%3D
%3F
(等等)的东西。你是对的,它确实有效。我问错了问题-我会修改它。(我使用的是busybox awk,版本1.4.2)我花了很长时间才意识到这一行代码只用于一个变量,而不是整个URL编码的字符串(例如,用
%20
%3F
填充的网址),这是一个乱码,例如UTF-8编码的非ASCII字符
awk '{for (y=0;y<127;y++) if (y!=37) gsub(sprintf("%%%02x|%%%02X",y,y), y==38 ? "\\&" : sprintf("%c", y));gsub(/%25/, "%");print}'
awk 'BEGIN {for (y=0;y<127;y++) if (y!=37) gsub(sprintf("%%%02x|%%%02X",y,y), y==38 ? "\\&" : sprintf("%c", y), ARGV[1]);gsub(/%25/, "%", ARGV[1]);print ARGV[1]}' parameter