使用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