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:
-
%21
torna-se!
-
%23
torna-se#
-
%24
se torna$
-
%26
torna-se&
-
%27
torna-se"
-
%28
torna-se(
-
%29
torna-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
printf
nã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=C
na 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%25xx
codificaçõ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
urlencode
codifica strings de acordo com RFC 1738.Ou seja, caracteres
A
–Z
a
–z
0
–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
urlencode
converte 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
-m
Em 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.
-d
Em 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
sed
visite - Esta é uma solução ruim, porque requer codificar todos os caracteres. Este problema é exemplificado por seu código sem a sequência de escape
%20
frequentemente usada. - @Overv I ‘ ve apenas Revisado
- Além disso, você pode querer verificar novamente o que
s/%26/&/g
faz. (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/+/ /g
transforma cada+
no espaço (conforme descrito na norma de codificação de url) -
-e "s/%\(..\)/\\\\x\1/g"
transforme cada%XX
em\\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
\\xXX
sequê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-e
pode ser omitida aqui na verdade … - @josch Você está certo,
printf
é um integrado emdash
e não ‘ não reconhece\x
escape. Você pode usar/usr/bin/printf
em vez deprintf
para 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
\x
escape 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/%/%%/g
no 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=/;