Quero decodificar a codificação de URL, existe alguma ferramenta integrada para fazer isso ou alguém poderia me fornecer um div id = “ae75b1150b”>
código que fará isso?
Eu pesquisei um pouco em unix.stackexchange.com e na internet, mas não consegui encontrar nenhuma ferramenta de linha de comando para decodificação codificação de url.
O que eu quero fazer é simplesmente editar um arquivo txt para que:
-
%21torna-se! -
%23torna-se# -
%24se torna$ -
%26torna-se& -
%27torna-se" -
%28torna-se( -
%29torna-se)
E assim por diante.
Comentários
- stackoverflow.com/questions/6250698/…
Resposta
Encontrou estes liners Python que fazem o que você quer:
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]))""
Exemplo
$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B
Referências
Comentários
- Eu sei disso muito tarde , mas há alguma maneira de fazer isso com a edição local?
- @DisplayName – soa como um novo Q para mim. Eu ‘ d pergunto e faço referência a este.
- streaming:
cat your_lovely_file.csv| python -c "import sys, urllib as ul; [sys.stdout.write(ul.quote_plus(l)) for l in sys.stdin]" - Veja @DIG mbl ‘ a resposta para aquele que trabalha com stdin.
Resposta
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
Observação: a sintaxe acima não pode converter + para espaços e pode comer todas as novas linhas.
Você pode defini-lo como um alias e adicioná-lo aos arquivos rc do shell:
$ alias urldecode="sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b""
Então, sempre que precisar, basta ir com:
$ echo "http%3A%2F%2Fwww" | urldecode http://www
Bash
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 “lida com vantagens (+) corretamente, então você deve substituí-los por espaços via sed ou conforme sugerido por @isaac , use a seguinte sintaxe:
decoded=$(input=${input//+/ }; printf "${input//%/\\x}")
Você também pode usar as seguintes funções urlencode() e 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}" }
Observe que
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 a 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 cdown “arquivo principal , também em stackoverflow .
PHP
Usando 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
Em 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
Tente anon solução:
awk -niord "{printf RT?$0chr("0x"substr(RT,2)):$0}" RS=%..
Observação: o parâmetro -n é específico do GNU awk.
Veja: Usando awk printf para urldecode texto .
decodificar nomes de arquivo
Se você precisar remover a codificação de url dos nomes de arquivo, use a ferramenta deurlname de renameutils (por exemplo deurlname *.*).
Veja também:
- Pode wget decodificar uri nomes de arquivo ao baixar em lote?
- Como remover a codificação URI de nomes de arquivo?
Relacionado:
- Como decodificar string codificada por URL no shell? em SO
- Como posso codificar e decodificar strings codificadas em porcentagem na linha de comando? em Ask Ubuntu
Comentários
-
awk: Como isso faz uso de uma função de biblioteca,chr(), há uma grande probabilidade de que funcione apenas no GNU awk (gawk). No entanto, neste caso, dificilmente haverá qualquer equivalente para POSIXawk, porque a opção-n(permitindo argumentos não decimais) É uma especialidade GNUawk. - Suas soluções envolvendo
printfnão levam em consideração que o url pode conter sinais de porcentagem de escape como%25. Você os passa para printf sem escapar deles para printf com outro sinal de porcentagem como%%. - A versão bash requer
local LC_ALL=Cna parte superior, caso contrário, todos os caracteres largos (ou seja, japonês, chinês etc.) não serão divididos em bytes. - github.com/SixArm/ urlencode.sh
- As versões printf não ‘ não funcionam ao usar a versão BSD de printf (por exemplo, macOS), no entanto, funciona bem ao usar o Versão GNU Coreutils.
Resposta
Há uma função embutida para isso na biblioteca padrão do Python. No Python 2, é “s urllib.unquote .
decoded_url=$(python2 -c "import sys, urllib; print urllib.unquote(sys.argv[1])" "$encoded_url")
Ou para processar um arquivo:
python2 -c "import sys, urllib; print urllib.unquote(sys.stdin.read())" <file >file.new && mv -f file.new file
No Python 3, é “s urllib.parse.unquote .
decoded_url=$(python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" "$encoded_url")
Ou para processar um arquivo:
python3 -c "import sys, urllib; print(urllib.parse.unquote(sys.stdin.read()))" <file >file.new && mv -f file.new file
Em 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
Se você quiser usar as ferramentas portáteis POSIX, ” é estranho, porque o único candidato sério é estranho, que não analisa números hexadecimais. Veja Usando awk printf para urldecode texto para exemplos com implementações comuns de awk, incluindo BusyBox.
Resposta
Perl one liner:
$ perl -pe "s/\%(\w\w)/chr hex $1/ge"
Exemplo:
$ echo "%21%22" | perl -pe "s/\%(\w\w)/chr hex $1/ge" !"
Comentários
- Essa resposta é atraente quando você não ‘ quer lidar com a instalação de módulos perl.
- Apenas um que funcionou elegantemente para mim no MacOS.
- Se você deseja resolver todos os níveis de codificação de URL de uma vez, existe ‘ s também
perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);'que decodificará todas as%25xxcodificações aninhadas
Resposta
Se você deseja usar um comando sed simplório, use o seguinte:
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"
Mas é mais conveniente criar um script como (digamos sedscript):
s/%21/!/g s/%23/#/g s/%24/$/g s/%26/\&/g s/%27/"/g s/%28/(/g s/%29/)/g
Em seguida, execute sed -f sedscript < old > new, que terá a saída desejada.
Para facilitar, o comando urlencode também está disponível diretamente em gridsite-clients pode ser instalado de (por sudo apt-get install gridsite-clients no sistema Ubuntu / Debian).
NOME
urlencode – converte strings de ou para a forma codificada por URL
SINOPSE
urlencode [-m|-d] string [string ...]DESCRIÇÃO
urlencodecodifica strings de acordo com RFC 1738.Ou seja, caracteres
A–Za–z0–9._e-são passados sem modificações, mas todos os outros caracteres são representados como% HH, onde HH é seu dois-d representação ASCII hexadecimal em maiúsculas igit. Por exemplo, o URLhttp://www.gridpp.ac.uk/torna-sehttp%3A%2F%2Fwww.gridpp.ac.uk%2F
urlencodeconverte cada caractere em todas as strings fornecidas na linha de comando. Se várias strings forem fornecidas, elas serão concatenadas com espaços de separação antes da conversão.OPÇÕES
-mEm vez de conversão completa, faça GridSite “codificação moderada de URL” em que AZ az 0-9. = – _ @ e / são passados sem modificações. Isso resulta em strings mais legíveis por humanos, mas o aplicativo deve estar preparado para criar ou simular os diretórios implícitos em quaisquer barras.
-dEm vez disso, decodificação do que a codificação, de acordo com a RFC 1738. As strings% HH e% hh são convertidas e outros caracteres são passados sem modificações, com a exceção de que
+é convertido em espaço.
Exemplo de URL de decodificação:
$ urlencode -d "http%3a%2f%2funix.stackexchange.com%2f" http://unix.stackexchange.com/ $ urlencode -d "Example: %21, %22, . . . , %29 etc" Example: !, ", . . . , ) etc
Comentários
- Para tutorial sobre
sedvisite - Esta é uma solução ruim, porque requer codificar todos os caracteres. Este problema é exemplificado por seu código sem a sequência de escape
%20frequentemente usada. - @Overv I ‘ ve apenas Revisado
- Além disso, você pode querer verificar novamente o que
s/%26/&/gfaz. (Eu corrigi.)
Resposta
Não posso “comentar melhor resposta neste tópico , então aqui está a minha.
Pessoalmente, eu uso estes aliases para codificação e decodificação de URL:
alias urlencode="python -c "import urllib, sys; print urllib.quote( sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"" alias urldecode="python -c "import urllib, sys; print urllib.unquote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])""
Ambos os comandos permitem que você converta dados, passados como um argumento de linha de comando ou leia-os de entrada padrão , porque ambos verificam se há argumentos de linha de comando (mesmo os vazios) e os processam ou apenas lêem entrada padrão caso contrário.
update 2017-05-23 (codificação de barra)
Em resposta ao comentário de @Bevor.
Se você também precisa codificar a barra, basta adicionar um segundo argumento vazio à função de aspas, então a barra também será codificada.
Então, finalmente urlencode alias em bash se parece com isto:
alias urlencode="python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")""
Exame ple
$ urlencode "Проба пера/Pen test" %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test $ echo "Проба пера/Pen test" | urlencode %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test $ urldecode %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test Проба пера/Pen test $ echo "%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test" | urldecode Проба пера/Pen test $ urlencode "Проба пера/Pen test" | urldecode Проба пера/Pen test $ echo "Проба пера/Pen test" | urlencode | urldecode Проба пера/Pen test
Comentários
- Não codifica barras.
- @Bevor : Exemplo?
- Adicionar uma barra ao urlencode ” Проба пера ” – > resultado: a barra não está codificada.
- @Bevor: Você está certo. Obrigado pelo seu comentário. Eu também mudarei minha resposta para refletir seu comentário nela.
Resposta
GNU Awk
#!/usr/bin/awk -fn @include "ord" BEGIN { RS = "%.." } { printf "%s", $0 if (RT != "") { printf "%s", chr("0x" substr(RT, 2)) } }
Resposta
E outra abordagem Perl:
#!/usr/bin/env perl use URI::Encode; my $uri = URI::Encode->new( { encode_reserved => 0 } ); while (<>) { print $uri->decode($_) }
Você precisará instalar o módulo URI::Encode. No meu Debian, eu poderia simplesmente executar
sudo apt-get install liburi-encode-perl
Então, executei o script acima em um arquivo de teste contendo:
http://foo%21asd%23asd%24%26asd%27asd%28asd%29
O resultado foi (salvei o script como foo.pl):
$ ./foo.pl http://foo!asd#asd$&asd"asd(asd)
Resposta
Uma resposta em shell (principalmente Posix):
$ input="%21%22" $ printf "`printf "%s\n" "$input" | sed -e "s/+/ /g" -e "s/%\(..\)/\\\\x\1/g"`" !"
Explicação:
-
-e "s/+/ /gtransforma cada+no espaço (conforme descrito na norma de codificação de url) -
-e "s/%\(..\)/\\\\x\1/g"transforme cada%XXem\\xXX. Observe um dos\será removido citando as regras. - O printf interno está lá apenas para passar a entrada para o sed. Podemos substituí-lo por qualquer outro mecanismo
- O printf externo interpreta
\\xXXsequências e exibe o resultado.
Editar:
Uma vez que % deve sempre ser interpretado em URLs, é possível simplificar esta resposta. Além disso, acho mais limpo usar xargs em vez de crases (graças a @josch).
$ input="%21%22+%25" $ printf "%s\n" "$input" | sed -e "s/+/ /g; s/%/\\x/g" | xargs -0 printf !" %
Infelizmente, (como @josch notou) nenhuma dessas soluções é compatível com Posix, pois a \x sequência de escape não está definida em Posix.
Comentários
- Bem-vindo a U & L. Talvez você possa explicar essa resposta e como ela funciona. Geralmente preferimos que nossas respostas sejam longas, com detalhes, não apenas trechos de código.
- Gosto muito dessa resposta porque ‘ é abrangente, portátil e não ‘ t requerem programas externos mais pesados como perl ou python. Funciona bem para mim.
- Ótima solução. E ainda mais curto e inteligente:
... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'. A opção-epode ser omitida aqui na verdade … - @josch Você está certo,
printfé um integrado emdashe não ‘ não reconhece\xescape. Você pode usar/usr/bin/printfem vez deprintfpara fazê-lo funcionar. Normalmente, você deve poder usarcommand printf, mas parece não funcionar como deveria. Ele continua a usar integrado. - @Jezz de fato, o suporte para
\xescape não faz parte do POSIX: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html Durante meus testes, percebi outro problema. Você pode querer substituir seu..regex por[a-zA-Z0-9][a-zA-Z0-9], caso contrário, insira como ‘ %% % ‘ irá falhar. Eu também adicioneis/%/%%/gno final para garantir que as porcentagens de escape para printf.
Resposta
Outra solução usando ruby (a resposta aceita do Python não estava funcionando para mim)
alias urldecode="ruby -e "require \"cgi\"; puts CGI.unescape(ARGV[0])"" alias urlencode="ruby -e "require \"cgi\"; puts CGI.escape(ARGV[0])""
Exemplo
$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B
Comentários
- Acabei de usar o Ruby, e essas declarações parecem menores. Além disso, mudei para ARGF.read para poder canalizá-lo como faço com muitos outros utilitários!
Resposta
Aqui está uma função BASH para fazer exatamente isso:
function urldecode() { echo -ne $(echo -n "$1" | sed -E "s/%/\\\\x/g") }
Comentários
- funciona perfeitamente
- Se você deseja converter
+caracteres em espaços e não gerar nenhum processo, você pode usar isto:: "${1//+/ }" && echo -e "${_//%/\\x}"
Resposta
Somente shell:
$ x="a%20%25%e3%81%82";printf "${x//\%/\\x}" a %あ
Adicione -- ou %b para evitar que os argumentos que começam com um travessão sejam tratados como opções.
Em zsh ${x//%/a} adiciona a ao final, mas ${x//\%/a} substitui % por a.
Resposta
Aqui estão as partes relevantes de outro script (que eu descaradamente roubou meu script de download do youtube.com de outra resposta) que escrevi antes. Ele usa sed e o shell para construir um urldecode funcional.
set \! \" \# \$ \% \& \" \( \) \* \ \+ \, \/ \: \; \= \? \@ \[ \] for c do set "$@" ""$c" "$c"; shift; done curl -s "$url" | sed "s/\\u0026/\&/g;""$( printf "s/%%%X/\\%s/g;" "$@" )"
Não juro que é abrangente – e na verdade eu duvido – mas segurou o YouTube com certeza o suficiente.
Resposta
A solução simples para strings curtas (o shell é lentowww):
$ str="q+werty%3D%2F%3B" $ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n" q werty=/;