Como posso codificar e decodificar seqüências de caracteres com porcentagem codificada (URL codificada) na linha de comando?
Estou procurando uma solução que possa fazer isso:
$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük
command-line
conversion
text
encoding
url
ændrük
fonte
fonte
%E6ndr%FCk
não parece UTF8 (padrão) para mim. Ou é apenas um exemplo?Respostas:
Estes comandos fazem o que você deseja:
Se você deseja codificar espaços como
+
, substituaurllib.quote
porurllib.quote_plus
.Eu estou supondo que você queira apelidá-los ;-)
fonte
Concha
Tente a seguinte linha de comando:
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:bash + xxd
Função Bash com
xxd
ferramenta:Encontrado no arquivo gist do cdown , também no stackoverflow .
Python
Tente definir os seguintes aliases:
Uso:
Fonte: ruslanspivak
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:
sed
O uso
sed
pode ser conseguido por:awk
Experimente a solução anon :
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:
Relacionado:
fonte
%
, talvez você possa substituirprintf "$c"
porprintf "%c" "$c"
? Um outro problema é que alguns caracteres não ASCII não são codificados (comoä
) em algumas configurações de idioma, talvez adicione umexport LC_ALL=C
na função (que não deve afetar nada fora da função)?Caracteres URI reservados com codificação percentual e caracteres não ASCII
-s
(--slurp
) lê as linhas de entrada em uma matriz e-s -R
(--slurp --raw-input
) lê a entrada em uma única sequência.-r
(--raw-output
) gera o conteúdo das strings em vez dos literais JSON.Codificar por cento todos os caracteres
tr -d \\n
remove os feeds de linha adicionadosxxd -p
após cada 60 caracteres.Codificar por cento todos os caracteres, exceto caracteres alfanuméricos ASCII no Bash
Sem
-d ''
isso, pularia as alimentações de linha e bytes nulos. SemIFS=
isso, substituiria os caracteresIFS
por%00
. SemLC_ALL=C
isso, por exemplo, seria substituídoあ
por%3042
um código de idioma UTF-8.fonte
Solução de bash pura apenas para decodificação :
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.
atualização 16/07/2015 (vazio 1º argumento)
... de acordo com o comentário do @muru.
atualizar 2017-05-28 (codificação de barra)
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
sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1]
pode ser mais apropriado. Especialmente se você usar isso em scripts e acidentalmente fornecer um primeiro argumento vazio.len(sys.argv) < 2 and sys.stdin.read()[0:-1] or sys.argv[1]
Agora:sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1]
isto é, se houver mesmo um primeiro argumento vazio, o comando não espera pela entrada da entrada padrão, mas processa um argumento vazio.Encontrei um pacote,
renameutils
que contém o utilitáriodeurlname
que é capaz de renomear um arquivo contendo caracteres "codificados por cento".Infelizmente, ele não decodifica stdin ou uma opção de linha de comando, mas apenas renomeia um arquivo; portanto, você deve criar um arquivo fictício para obter a decodificação (o nome do arquivo renomeado), mas com alguns scripts de bash, o processo pode ser automatizado. .
Nenhuma informação sobre a parte de codificação, mesmo porque pode ser questionável quais caracteres codificar. Apenas não ASCII?
Eu acho que deveria haver alguma ferramenta / método melhor.
fonte
Semelhante ao Stefano ansqer, mas em Python 3:
Para codificar também barras:
Mais informações sobre a diferença aqui .
fonte
Aqui está uma função POSIX Awk para codificação:
Exemplo
fonte