Quero decodificar a codificação de URL, existe alguma ferramenta interna para fazer isso ou alguém poderia me fornecer um sed
código que faça isso?
Pesquisei um pouco no unix.stackexchange.com e na Internet, mas não consegui encontrar nenhuma ferramenta de linha de comando para decodificar a codificação de URL.
O que eu quero fazer é simplesmente editar um txt
arquivo para que:
%21
torna-se!
%23
torna-se#
%24
torna-se$
%26
torna-se&
%27
torna-se'
%28
torna-se(
%29
torna-se)
E assim por diante.
shell-script
text-processing
sed
url
Mostrar nome
fonte
fonte
Respostas:
Encontrei os liners one Python que fazem o que você deseja:
Exemplo
Referências
fonte
cat your_lovely_file.csv| python -c "import sys, urllib as ul; [sys.stdout.write(ul.quote_plus(l)) for l in sys.stdin]"
python
é 3 por padrão, isso resultará em erro. Mudandopython
parapython2
ajuda.python3
você pode usar emimport urllib.parse as ul
vez deimport urllib as ul
.sed
Tente a seguinte linha de comando:
ou a seguinte alternativa usando
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 :
Depois, sempre que precisar, basta:
Bater
Ao criar scripts, você pode usar a seguinte sintaxe:
No entanto, a sintaxe acima não manipula as vantagens (
+
) corretamente, então você deve substituí-las por espaços porsed
.Você também pode usar o seguinte
urlencode()
eurldecode()
funções:Aqui está a versão semelhante de Joel encontrada em: https://github.com/sixarm/urldecode.sh
bash + xxd
Função Bash com
xxd
ferramenta:Encontrado no arquivo gist do cdown , também no stackoverflow .
PHP
Usando o PHP, você pode tentar o seguinte comando:
ou apenas:
Use
-R
para entrada de várias linhas.Perl
No Perl você pode usar
URI::Escape
.Ou para processar um arquivo:
awk
Experimente a solução anon :
Nota: O parâmetro
-n
é específico ao GNUawk
.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 derenameutils
(por exemplodeurlname *.*
).Veja também:
Palavras-chave:
fonte
awk
: Como isso faz uso de uma função de bibliotecachr()
, há uma alta probabilidade de que ele funcione apenas no GNU awk (gawk
). No entanto, nesse caso, dificilmente haverá equivalente para o POSIXawk
, porque a-n
opção (permitindo argumentos não decimais) É umaawk
especialidade do GNU .sed
código fornecexargs: argument line too long
um arquivo com ≥2164 linhas.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 escapá-los para printf com outro sinal de porcentagem como%%
.local LC_ALL=C
na parte superior, caso contrário, todos os caracteres largos (por exemplo, japonês, chinês etc.) não são divididos corretamente em bytes.Existe uma função interna para isso na biblioteca padrão do Python. No Python 2, é
urllib.unquote
.Ou para processar um arquivo:
No Python 3, é
urllib.parse.unquote
.Ou para processar um arquivo:
No Perl você pode usar
URI::Escape
.Ou para processar um arquivo:
Se você deseja manter as ferramentas portáteis POSIX, é complicado, porque o único candidato sério é o awk, que não analisa números hexadecimais. Consulte Usando o awk printf para codificar o texto para obter exemplos de implementações comuns do awk, incluindo o BusyBox.
fonte
Se você deseja usar um
sed
comando simplificado , use o seguinte:Mas é mais conveniente criar um script como (digamos
sedscript
):Em seguida
sed -f sedscript < old > new
, execute , que será exibido conforme desejado.Para facilitar, o comando
urlencode
também está disponível diretamente nogridsite-clients
pacote pode ser instalado a partir de (sudo apt-get install gridsite-clients
no sistema Ubuntu / Debian).Exemplo de URL de decodificação:
fonte
sed
visita%20
seqüência de escape usada com frequência .s/%26/&/g
faz. (I fixa-lo.)Perl um forro:
Exemplo:
fonte
GNU awk
Ou
Converter URL de arquivo codificado em porcentagem em arquivo local no bash
fonte
Não posso comentar sobre a melhor resposta neste tópico , então aqui está o meu.
Pessoalmente, eu uso esses aliases para codificação e decodificação de URL:
Ambos os comandos permitem converter dados, passados como um argumento de linha de comando ou lê-los a partir da entrada padrão , porque as duas linhas verificam se há argumentos de linha de comando (mesmo os vazios) e os processam ou apenas os leem da entrada padrão.
update 23-05-2017 (codificação com barra)
Em resposta ao comentário do @ Bevor.
Se você também precisar codificar a barra, basta adicionar um segundo argumento vazio à função de cotação, a barra também será codificada.
Então, finalmente, o
urlencode
alias no bash fica assim:Exemplo
fonte
E outra abordagem Perl:
Você precisará instalar o
URI::Encode
módulo. No meu Debian, eu poderia simplesmente executarEm seguida, executei o script acima em um arquivo de teste contendo:
O resultado foi (eu salvei o script como
foo.pl
):fonte
Uma resposta no shell (principalmente Posix):
Explicação:
-e 's/+/ /g
transforma cada uma+
no espaço (conforme descrito na norma de codificação de URL)-e 's/%\(..\)/\\\\x\1/g'
transformar cada%XX
no\\xXX
. Observe que um dos\
itens será removido pelas regras de citação.\\xXX
seqüências e exibe o resultado.Editar:
Como
%
sempre deve ser interpretado nos URLs, é possível simplificar esta resposta. Além disso, acho que é mais limpo usar emxargs
vez de aspas (graças a @josch).Infelizmente, (como @josch notou), nenhuma dessas soluções é compatível com Posix, pois a
\x
sequência de escape não está definida no Posix.fonte
... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'
. A-e
opção pode ser omitida aqui, na verdade ...printf
é um embutidodash
e não reconhece como\x
escapar. Você pode usar em/usr/bin/printf
vez deprintf
para fazê-lo funcionar. Normalmente, você deve poder usarcommand printf
, mas parece não funcionar como deveria. Ele continua usando o built-in.\x
escapar não faz parte do POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html Durante meus testes, vi outro problema. Você pode substituir seu..
regex[a-zA-Z0-9][a-zA-Z0-9]
porque, caso contrário, a entrada como '%%%' falhará. Eu também adicioneis/%/%%/g
no final para garantir uma porcentagem de escape para printf.Somente shell:
Adicione
--
ou%b
para impedir que os argumentos que começam com um traço sejam tratados como opções.No zsh
${x//%/a}
adicionaa
ao final, mas${x//\%/a}
substitui%
pora
.fonte
Aqui estão os bits relevantes de outro script (que eu roubei descaradamente do meu script de download do youtube.com de outra resposta) que eu escrevi antes. Ele usa
sed
e o shell para criar um código de funcionamento.Eu não juro que é abrangente - e, de fato, duvido -, mas ele segurou o youtube com certeza.
fonte
Aqui está uma função BASH para fazer exatamente isso:
fonte
Outra solução usando ruby (a resposta em python aceita não estava funcionando para mim)
Exemplo
fonte