代码之家  ›  专栏  ›  技术社区  ›  Johan

使用awk printf对文本进行urlcode

  •  8
  • Johan  · 技术社区  · 14 年前

    我在用 awk 对一些文本进行URL编码。

    如果我将字符串编码到 printf 类语句 printf "%s", "\x3D" 正确输出 = . 如果我把整个转义字符串作为变量,也是一样的。

    但是,如果我只有 3D ,如何附加 \x 所以 普林特 将打印 = 而不是 \x3D ?

    我在用 busybox awk 1.4.2 以及 ash 壳牌。

    5 回复  |  直到 7 年前
        1
  •  1
  •   Dennis Williamson    14 年前

    由于您使用的是ash,而perl不可用,所以我假设您可能没有 gawk .

    对我来说,用 呆呆地 梳妆台 ,除非使用 --posix 选项(在这种情况下,我得到“x3d”的 二者都 )

    如果我使用 --non-decimal-data --traditional 具有 呆呆地 我得到“=”。

    你用什么版本的锥子( awk , nawk , 呆呆地 ,busybox-和版本号?

    编辑:

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

    ~/busybox/awk 'BEGIN { string="3D"; pre="0x"; hex=pre string; printf "%c", hex+0}'
    
        2
  •  3
  •   zwol    10 年前

    我不知道如何在awk中实现这一点,但在Perl中这是微不足道的:

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

    GNU AWK

    #!/usr/bin/awk -fn
    @include "ord"
    BEGIN {
      RS = "%.."
    }
    {
      printf RT ? $0 chr("0x" substr(RT, 2)) : $0
    }
    

    #!/bin/sh
    awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
    

    Decoding URL encoding (percent encoding)

        4
  •  0
  •   Joel Jones    11 年前

    这依赖于GNUawk对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
          }'
    
        5
  •  0
  •   Whinger    7 年前

    首先,我知道这是一个老问题,但没有一个答案对我有效(仅限于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 '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
    

    最后必须执行%25,否则像%253d这样的字符串将被双解析,这是不应该发生的。

    y==38的内联检查是因为gsub将&视为特殊字符,除非您将其反斜杠。

    推荐文章