我有一个带有编码的用户代理列表的文件。
例如。:
Mozilla%2F5.0%20%28Macintosh%3B%20U%3B%20Intel%20Mac%20OS%20X%2010.6%3B%20en
我想要一个Shell脚本,它可以读取此文件并使用解码后的字符串写入新文件。
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en
我一直试图用这个例子来解决这个问题,但到目前为止还没有奏效。
$ echo -e "$(echo "%31+%32%0A%33+%34" | sed 'y/+/ /; s/%/\\x/g')"
我的脚本看起来像:
#!/bin/bash
for f in *.log; do
echo -e "$(cat $f | sed 'y/+/ /; s/%/\x/g')" > y.log
done
最佳答案
这是一个简单的单线解决方案。
$ function urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; }
它可能看起来像perl :),但仅仅是纯bash。没有awks,没有seds ...没有开销。使用:内置,特殊参数,模式替换和echo内置的-e选项将十六进制代码转换为字符。有关更多详细信息,请参见bash的联机帮助页。您可以将此功能用作单独的命令
$ urldecode https%3A%2F%2Fgoogle.com%2Fsearch%3Fq%3Durldecode%2Bbash
https://google.com/search?q=urldecode+bash
或在变量分配中,如下所示:
$ x="http%3A%2F%2Fstackoverflow.com%2Fsearch%3Fq%3Durldecode%2Bbash"
$ y=$(urldecode "$x")
$ echo "$y"
http://stackoverflow.com/search?q=urldecode+bash
关于bash - 如何在Shell中解码URL编码的字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6250698/