sed
Tente a seguinte linha de comando:
$ sed 's@+@ @g;s@%@\\x@g' file | xargs -0 printf "%b"
ou a seguinte alternativa usando echo -e
:
$ sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' file | xargs echo -e
Nota: A sintaxe acima pode não se converter +
em espaços e pode comer todas as novas linhas.
Você pode defini-lo como alias e adicioná-lo aos seus arquivos shell rc :
$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'
Depois, sempre que precisar, basta:
$ echo "http%3A%2F%2Fwww" | urldecode
http://www
Bater
Ao criar scripts, você pode usar a seguinte sintaxe:
input="http%3A%2F%2Fwww"
decoded=$(printf '%b' "${input//%/\\x}")
No entanto, a sintaxe acima não manipula as vantagens ( +
) corretamente, então você deve substituí-las por espaços por sed
.
Você também pode usar o seguinte urlencode()
e urldecode()
funções:
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}"
}
Observe que acima urldecode()
assume que os dados não contêm barra invertida.
Aqui está a versão semelhante de Joel encontrada em: https://github.com/sixarm/urldecode.sh
bash + xxd
Função Bash com xxd
ferramenta:
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
}
Encontrado no arquivo gist do cdown , também no stackoverflow .
PHP
Usando o PHP, você pode tentar o seguinte comando:
$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Or: php://stdin
oil and gas
ou apenas:
php -r 'echo urldecode("oil+and+gas");'
Use -R
para entrada de várias linhas.
Perl
No Perl você pode usar URI::Escape
.
decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")
Ou para processar um arquivo:
perl -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file
awk
Experimente a solução anon :
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
Nota: O parâmetro -n
é específico ao GNU awk
.
Consulte: Usando o awk printf para codificar o texto .
decodificando nomes de arquivo
Se você precisar remover a codificação de URL dos nomes dos arquivos, use a deurlname
ferramenta de renameutils
(por exemplo deurlname *.*
).
Veja também:
Palavras-chave: