如何在命令行上对百分比编码的字符串进行编码和解码?

ænd*_*rük 37 text command-line conversion encoding url

如何在命令行上编码和解码百分比编码(URL 编码)字符串?

我正在寻找可以做到这一点的解决方案:

$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük
Run Code Online (Sandbox Code Playgroud)

Ste*_*zzo 40

这些命令执行您想要的操作:

python -c "import urllib, sys; print urllib.quote(sys.argv[1])" æ
python -c "import urllib, sys; print urllib.unquote(sys.argv[1])" %C3%A6
Run Code Online (Sandbox Code Playgroud)

如果要将空格编码为+,请替换urllib.quoteurllib.quote_plus

我猜你会想给它们取别名;-)


ken*_*orb 31

贝壳

尝试以下命令行:

$ echo "%C3%A6ndr%C3%BCk" | sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
ændrük
Run Code Online (Sandbox Code Playgroud)

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

$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'
Run Code Online (Sandbox Code Playgroud)

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

$ echo "http%3A%2F%2Fwww" | urldecode
http://www
Run Code Online (Sandbox Code Playgroud)

猛击

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

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

但是,上述语法无法+正确处理加号 ( ),因此您必须通过sed.

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

$ echo "%C3%A6ndr%C3%BCk" | sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
ændrük
Run Code Online (Sandbox Code Playgroud)

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


bash + xxd

xxd工具的Bash 功能:

$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'
Run Code Online (Sandbox Code Playgroud)

cdown 的 gist 文件中找到,也在stackoverflow 中找到


Python

尝试定义以下别名:

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])"'
Run Code Online (Sandbox Code Playgroud)

用法:

$ urlencode "ændrük"
C%26ndrC%3Ck
$ urldecode "%C3%A6ndr%C3%BCk"
ændrük
Run Code Online (Sandbox Code Playgroud)

资料来源:鲁斯兰斯皮瓦克


PHP

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

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

要不就:

php -r 'echo urldecode("oil+and+gas");'
Run Code Online (Sandbox Code Playgroud)

使用-R多线路输入。


珀尔

在 Perl 中,您可以使用URI::Escape.

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

或处理文件:

perl -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file
Run Code Online (Sandbox Code Playgroud)

sed

使用sed可以通过以下方式实现:

cat file | sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' | xargs echo -e
Run Code Online (Sandbox Code Playgroud)

awk

尝试匿名解决方案:

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

请参阅:使用 awk printf 对文本进行 urldecode


解码文件名

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

也可以看看:


有关的:


小智 10

百分比编码保留 URI 字符和非 ASCII 字符

jq -s -R -r @uri
Run Code Online (Sandbox Code Playgroud)

-s( --slurp) 将输入行读入数组,-s -R( --slurp --raw-input) 将输入读入单个字符串。-r( --raw-output) 输出字符串的内容而不是 JSON 字符串文字。

对所有字符进行百分比编码

xxd -p|tr -d \\n|sed 's/../%&/g'
Run Code Online (Sandbox Code Playgroud)

tr -d \\n删除xxd -p每 60 个字符后添加的换行符。

在 Bash 中对除 ASCII 字母数字字符以外的所有字符进行百分比编码

jq -s -R -r @uri
Run Code Online (Sandbox Code Playgroud)

没有-d ''这将跳过换行符和空字节。如果没有IFS=这将IFS%00. 如果没有LC_ALL=C这个,例如在 UTF-8 语言环境中替换?%3042


小智 7

仅用于解码的纯 bash 解决方案:

$ a='%C3%A6ndr%C3%BCk'
$ echo -e "${a//%/\\x}"
ændrük
Run Code Online (Sandbox Code Playgroud)


Pab*_*chi 7

类似于Stefano ansqer,但使用 Python 3:

\n
python3 -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1]))" \xc3\xa6         # to percent-enconding\npython3 -c "import urllib.parse, sys; print(urllib.parse.unquote(sys.argv[1]))" %C3%A6  # from percent-enconding\n
Run Code Online (Sandbox Code Playgroud)\n

还要对斜杠进行编码:

\n
python3 -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \\"\\"))"\n
Run Code Online (Sandbox Code Playgroud)\n

有关差异的更多信息请参见此处

\n


DIG*_*mbl 5

我无法评论该线程中的最佳答案,所以这是我的。

\n\n

就我个人而言,我使用这些别名进行 URL 编码和解码:

\n\n
alias urlencode=\'python -c "import urllib, sys; print urllib.quote(  sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"\'\n\nalias urldecode=\'python -c "import urllib, sys; print urllib.unquote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

这两个命令都允许您转换数据,作为命令行参数传递或从标准输入读取数据,因为两个单行命令都会检查是否存在命令行参数(甚至是空参数)并处理它们,否则只是读取标准输入。

\n\n

更新 2015-07-16(空第一个参数)

\n\n

...根据@muru 评论。

\n\n

更新2017-05-28(斜杠编码)

\n\n

如果还需要对斜杠进行编码,只需在 quote 函数中添加一个空的第二个参数,那么斜杠也会被编码。

\n\n

所以,bash中的urlencode 别名最终如下所示:

\n\n
alias urlencode=\'python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \\"\\")"\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

例子

\n\n
$ urlencode "\xd0\x9f\xd1\x80\xd0\xbe\xd0\xb1\xd0\xb0 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb0/Pen test"\n%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test\n\n$ echo "\xd0\x9f\xd1\x80\xd0\xbe\xd0\xb1\xd0\xb0 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb0/Pen test" | urlencode\n%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test\n\n$ urldecode %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test\n\xd0\x9f\xd1\x80\xd0\xbe\xd0\xb1\xd0\xb0 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb0/Pen test\n\n$ echo "%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test" | urldecode\n\xd0\x9f\xd1\x80\xd0\xbe\xd0\xb1\xd0\xb0 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb0/Pen test\n\n$ urlencode "\xd0\x9f\xd1\x80\xd0\xbe\xd0\xb1\xd0\xb0 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb0/Pen test" | urldecode\n\xd0\x9f\xd1\x80\xd0\xbe\xd0\xb1\xd0\xb0 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb0/Pen test\n\n$ echo "\xd0\x9f\xd1\x80\xd0\xbe\xd0\xb1\xd0\xb0 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb0/Pen test" | urlencode | urldecode\n\xd0\x9f\xd1\x80\xd0\xbe\xd0\xb1\xd0\xb0 \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb0/Pen test\n
Run Code Online (Sandbox Code Playgroud)\n