解码URL编码(百分比编码)

解码URL编码(百分比编码)

我想解码 URL 编码,是否有任何内置工具可以执行此操作,或者有人可以为我提供sed执行此操作的代码吗?

我确实搜索了一下unix.stackexchange.com在互联网上,但我找不到任何用于解码 url 编码的命令行工具。

我想做的只是就地编辑文件,txt以便:

  • %21变成!
  • %23变成#
  • %24变成$
  • %26变成&
  • %27变成'
  • %28变成(
  • %29变成)

等等。

答案1

发现这些Python oneliner可以做你想要的事情:

Python2

$ alias urldecode='python -c "import sys, urllib as ul; \
    print ul.unquote_plus(sys.argv[1])"'

$ alias urlencode='python -c "import sys, urllib as ul; \
    print ul.quote_plus(sys.argv[1])"'

Python3

$ alias urldecode='python3 -c "import sys, urllib.parse as ul; \
    print(ul.unquote_plus(sys.argv[1]))"'

$ alias urlencode='python3 -c "import sys, urllib.parse as ul; \
    print (ul.quote_plus(sys.argv[1]))"'

例子

$ urldecode 'q+werty%3D%2F%3B'
q werty=/;

$ urlencode 'q werty=/;'
q+werty%3D%2F%3B

参考

答案2

sed

尝试以下命令行:

$ sed 's@+@ @g;s@%@\\x@g' file | xargs -0 printf "%b"

或使用以下替代方案echo -e

$ sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' file | xargs echo -e

注意:上面的语法可能不会转换+为空格,并且可以吃掉所有换行符。


您可以将其定义为别名并将其添加到您的 shell 中RC文件:

$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'

然后每次当你需要它时,只需使用:

$ echo "http%3A%2F%2Fwww" | urldecode
http://www

重击

编写脚本时,可以使用以下语法:

input="http%3A%2F%2Fwww"
decoded=$(printf '%b' "${input//%/\\x}")

然而,上面的语法无法+正确处理加号 ( ),因此您必须通过以下方式将它们替换为空格sed或 按照建议将它们替换为空格@isaac,使用以下语法:

decoded=$(input=${input//+/ }; printf "${input//%/\\x}")

您还可以使用以下urlencode()功能urldecode()

urlencode() {
    # urlencode <string>
    local length="${#1}"
    for (( i = 0; i < length; i++ )); do
        local c="${1:i:1}"
        case $c in
            [a-zA-Z0-9.~_-]) printf "$c" ;;
            *) printf '%%%02X' "'$c" ;;
        esac
    done
}
 
urldecode() {
    # urldecode <string>
 
    local url_encoded="${1//+/ }"
    printf '%b' "${url_encoded//%/\\x}"
}

请注意,上面urldecode()假设数据不包含反斜杠。

这是乔尔的类似版本:https://github.com/sixarm/urldecode.sh


bash + xxd

带有工具的 Bash 函数xxd

urlencode() {
  local length="${#1}"
  for (( i = 0; i < length; i++ )); do
    local c="${1:i:1}"
    case $c in
      [a-zA-Z0-9.~_-]) printf "$c" ;;
    *) printf "$c" | xxd -p -c1 | while read x;do printf "%%%s" "$x";done
  esac
done
}

在发现cdown 的要点文件,也在堆栈溢出


PHP

使用 PHP,您可以尝试以下命令:

$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Or: php://stdin
oil and gas

要不就:

php -r 'echo urldecode("oil+and+gas");'

用于-R多行输入。


Perl

在 Perl 中你可以使用URI::Escape

decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")

或者处理文件:

perl -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file

awk

尝试匿名解决方案:

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

注意:参数-n特定于 GNU awk

尝试斯蒂芬·查泽拉斯urlencode解决方案:

awk -v RS='&#[0-9]+;' -v ORS= '1;RT{printf("%%%02X", substr(RT,3))}'

看:使用 awk printf 对文本进行 urldecode

解码文件名

如果您需要从文件名中删除 url 编码,请使用(例如)deurlname中的工具。renameutilsdeurlname *.*

也可以看看:


有关的:

答案3

Python 标准库中有一个内置函数可以实现这一点。在Python 2中,它是urllib.unquote

decoded_url=$(python2 -c 'import sys, urllib; print urllib.unquote(sys.argv[1])' "$encoded_url")

或者处理文件:

python2 -c 'import sys, urllib; print urllib.unquote(sys.stdin.read())' <file >file.new &&
mv -f file.new file

在Python 3中,它是urllib.parse.unquote

decoded_url=$(python3 -c 'import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))' "$encoded_url")

或者处理文件:

python3 -c 'import sys, urllib.parse; print(urllib.parse.unquote(sys.stdin.read()))' <file >file.new &&
mv -f file.new file

在 Perl 中你可以使用URI::Escape

decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")

或者处理文件:

perl -pli -MURI::Escape -e '$_ = uri_unescape($_)' file

如果您想坚持使用 POSIX 便携式工具,那就很尴尬了,因为唯一认真的候选者是 awk,它不解析十六进制数字。看使用 awk printf 对文本进行 urldecode例如常见的 awk 实现,包括 BusyBox。

答案4

如果您想使用简单的sed命令,请使用以下命令:

sed -e 's/%21/!/g' -e 's/%23/#/g' -e 's/%24/$/g' -e 's/%26/\&/g' -e "s/%27/'/g" -e 's/%28/(/g' -e 's/%29/)/g'

但创建一个像(比如说sedscript)这样的脚本会更方便:

s/%21/!/g
s/%23/#/g
s/%24/$/g
s/%26/\&/g
s/%27/'/g
s/%28/(/g
s/%29/)/g

然后运行sed -f sedscript < old > new​​,它将根据您的需要输出。


为了方便起见,命令urlencode也可以直接以gridsite-clients软件包形式安装(sudo apt-get install gridsite-clients在 Ubuntu/Debian 系统中)。

姓名

    urlencode - 将字符串与 URL 编码形式相互转换
概要

    urlencode [-m|-d] string [string ...]

描述

    urlencode根据 RFC 1738 对字符串进行编码。

    也就是说,字符A- Z a- z 0-9 . _-不加修改地传递,但所有其他字符都表示为 %HH,其中 HH 是它们的两位大写十六进制 ASCII 表示形式。例如,URLhttp://www.gridpp.ac.uk/变为http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencode转换命令行上给出的所有字符串中的每个字符。如果给出多个字符串,则在转换之前将它们用分隔空格连接起来。

选项
    -m
      不进行完全转换,而是进行 GridSite“温和 URL 编码”,其中 AZ az 0-9 。 = - _ @ 和 / 未经修改地传递。这会产生稍微更容易理解的字符串,但应用程序必须准备好创建或模拟任何斜杠所暗示的目录。
    -d
      +根据 RFC 1738 进行 URL 解码而不是编码。%HH 和 %hh 字符串将被转换,其他字符将不加修改地传递,但转换为空格的例外。

解码URL示例:

$ urlencode -d "http%3a%2f%2funix.stackexchange.com%2f"
http://unix.stackexchange.com/

$ urlencode -d "Example: %21, %22, . . . , %29 etc"
Example: !, ", . . . , ) etc

相关内容