我想解码 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
中的工具。renameutils
deurlname *.*
也可以看看:
有关的:
- 如何在 shell 中解码 URL 编码的字符串?于SO
- 如何在命令行上对百分比编码的字符串进行编码和解码?在询问 Ubuntu
答案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