Voglio decodificare la codifica dellURL, esiste uno strumento integrato per farlo o qualcuno potrebbe fornirmi un sed
codice che lo farà?
Ho cercato un po in unix.stackexchange.com e su Internet ma non sono riuscito a trovare alcuno strumento a riga di comando per la decodifica codifica URL.
Quello che voglio fare è semplicemente modificare un file txt
in modo che:
-
%21
diventa!
-
%23
diventa#
-
%24
diventa$
-
%26
diventa&
-
%27
diventa"
-
%28
diventa(
-
%29
diventa)
E così via.
Commenti
- stackoverflow.com/questions/6250698/…
Risposta
Ho trovato queste righe di Python che fanno quello che vuoi:
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]))""
Esempio
$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B
Riferimenti
Commenti
- Lo so molto tardi , ma cè un modo per farlo con lediting sul posto?
- @DisplayName – mi suona come una nuova Q. ‘ lo chiedo e faccio riferimento a questo.
- 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]"
- Vedi @DIG mbl ‘ s beblow per uno che funziona con stdin.
Risposta
sed
Prova la seguente riga di comando:
$ sed "s@+@ @g;s@%@\\x@g" file | xargs -0 printf "%b"
o la seguente alternativa utilizzando echo -e
:
$ sed -e"s/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g" file | xargs echo -e
Nota: la sintassi precedente potrebbe non convertire +
agli spazi e può mangiare tutte le nuove righe.
Puoi definirlo come alias e aggiungerlo ai tuoi file rc della shell:
$ alias urldecode="sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b""
Quindi, ogni volta che ne hai bisogno, segui semplicemente:
$ echo "http%3A%2F%2Fwww" | urldecode http://www
Bash
Durante lo scripting, puoi utilizzare la seguente sintassi:
input="http%3A%2F%2Fwww" decoded=$(printf "%b" "${input//%/\\x}")
Tuttavia la sintassi precedente non “t gestisce i vantaggi (+
) correttamente, quindi devi sostituirli con spazi tramite sed
o come suggerito da @isaac , utilizza la seguente sintassi:
decoded=$(input=${input//+/ }; printf "${input//%/\\x}")
Puoi anche utilizzare le seguenti urlencode()
e urldecode()
funzioni:
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}" }
Tieni presente che
urldecode()
presume che i dati non contengano barra rovesciata.
Ecco una versione simile di Joel trovata in: https://github.com/sixarm/urldecode.sh
bash + xxd
Funzione Bash con lo strumento xxd
:
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 }
Trovato nel cdown “s file gist , anche in stackoverflow .
PHP
Utilizzando PHP puoi provare il seguente comando:
$ echo oil+and+gas | php -r "echo urldecode(fgets(STDIN));" // Or: php://stdin oil and gas
o semplicemente:
php -r "echo urldecode("oil+and+gas");"
Utilizza -R
per limmissione di più righe.
Perl
In Perl tu può utilizzare URI::Escape
.
decoded_url=$(perl -MURI::Escape -e "print uri_unescape($ARGV[0])" "$encoded_url")
Oppure per elaborare un file:
perl -i -MURI::Escape -e "print uri_unescape($ARGV[0])" file
awk
Prova anon soluzione:
awk -niord "{printf RT?$0chr("0x"substr(RT,2)):$0}" RS=%..
Nota: il parametro -n
è specifico di GNU awk
.
Vedi: Uso di awk printf per urldecode testo .
decodifica dei nomi dei file
Se devi rimuovere la codifica dellURL dai nomi dei file, utilizza lo strumento deurlname
da renameutils
(es deurlname *.*
).
Vedi anche:
- Può wget decodificare uri nomi di file durante il download in batch?
- Come rimuovere la codifica URI dai nomi di file?
Correlati:
- Come decodificare una stringa con codifica URL nella shell? in SO
- Come posso codificare e decodificare le stringhe con codifica percentuale sulla riga di comando? su Ask Ubuntu
Commenti
-
awk
: poiché questo fa utilizzando una funzione di libreria,chr()
, cè unalta probabilità che funzioni esclusivamente su GNU awk (gawk
). Tuttavia, in questo caso non ci sarà quasi alcun equivalente per POSIXawk
, perché lopzione-n
(che consente argomenti non decimali) È unaawk
specialità GNU. - Le tue soluzioni che coinvolgono
printf
non tengono conto che lURL potrebbe contenere segni di percentuale di escape come%25
. Li passi a printf senza eseguire lescape per printf con un altro segno di percentuale come%%
. - La versione bash richiede
local LC_ALL=C
in alto, altrimenti tutti i caratteri larghi (ad esempio giapponese, cinese e così via) non vengono suddivisi correttamente in byte. - github.com/SixArm/ urlencode.sh
- Le versioni printf don ‘ t funzionano quando si usa la versione BSD di printf (es. macOS), tuttavia funziona bene quando si usa il Versione GNU Coreutils.
Risposta
Esiste una funzione incorporata per questo nella libreria standard di Python. In Python 2, “s urllib.unquote
.
decoded_url=$(python2 -c "import sys, urllib; print urllib.unquote(sys.argv[1])" "$encoded_url")
Oppure per elaborare un file:
python2 -c "import sys, urllib; print urllib.unquote(sys.stdin.read())" <file >file.new && mv -f file.new file
In Python 3, “s urllib.parse.unquote
.
decoded_url=$(python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" "$encoded_url")
Oppure per elaborare un file:
python3 -c "import sys, urllib; print(urllib.parse.unquote(sys.stdin.read()))" <file >file.new && mv -f file.new file
In Perl puoi utilizzare URI::Escape
.
decoded_url=$(perl -MURI::Escape -e "print uri_unescape($ARGV[0])" "$encoded_url")
Oppure per elaborare un file:
perl -i -MURI::Escape -e "print uri_unescape($ARGV[0])" file
Se vuoi restare fedele agli strumenti portatili POSIX, ” è imbarazzante, perché lunico candidato serio è awk, che non analizza i numeri esadecimali. Vedi Utilizzo di awk printf per urldecode testo per esempi con implementazioni awk comuni, incluso BusyBox.
Risposta
Perl one liner:
$ perl -pe "s/\%(\w\w)/chr hex $1/ge"
Esempio:
$ echo "%21%22" | perl -pe "s/\%(\w\w)/chr hex $1/ge" !"
Commenti
- Questa risposta è interessante quando ‘ non vuoi occuparti dellinstallazione di moduli perl.
- Solo uno che ha funzionato elegantemente per me su MacOS.
- Se desideri risolvere tutti i livelli di codifica URL contemporaneamente, è disponibile ‘ s anche
perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);'
che decodificherà tutte le%25xx
codifiche nidificate
Risposta
Se desideri utilizzare un semplice comando sed
, utilizza quanto segue:
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"
Ma è più comodo creare uno script come (ad esempio sedscript
):
s/%21/!/g s/%23/#/g s/%24/$/g s/%26/\&/g s/%27/"/g s/%28/(/g s/%29/)/g
Quindi esegui sed -f sedscript < old > new
, che produrrà come desideri.
Per comodità, il comando urlencode
è disponibile anche direttamente in gridsite-clients
può essere installato da (da sudo apt-get install gridsite-clients
nel sistema Ubuntu / Debian).
NAME
urlencode – converte le stringhe in o dal formato con codifica URL
SINOSSI
urlencode [-m|-d] string [string ...]
DESCRIZIONE
urlencode
codifica le stringhe in base alla RFC 1738.Ovvero, i caratteri
A
–Z
a
–z
0
–9
.
_
e-
vengono trasmessi senza modifiche, ma tutti gli altri caratteri sono rappresentati come% HH, dove HH è la loro due-d igit rappresentazione ASCII esadecimale maiuscola. Ad esempio, lURLhttp://www.gridpp.ac.uk/
diventahttp%3A%2F%2Fwww.gridpp.ac.uk%2F
urlencode
converte ogni carattere in tutte le stringhe fornite sulla riga di comando. Se vengono fornite più stringhe, vengono concatenate con spazi di separazione prima della conversione.OPZIONI
-m
Invece della conversione completa, esegui la “codifica URL moderata” di GridSite in cui AZ az 0-9. = – _ @ e / vengono passati senza modifiche. Ciò si traduce in stringhe leggermente più leggibili dalluomo, ma lapplicazione deve essere preparata per creare o simulare le directory implicite da eventuali barre.
-d
Decodifica piuttosto lURL rispetto alla codifica, secondo la RFC 1738. Le stringhe% HH e% hh vengono convertite e altri caratteri vengono passati senza modifiche, con leccezione che
+
viene convertito in spazio.
Esempio di decodifica URL:
$ urlencode -d "http%3a%2f%2funix.stackexchange.com%2f" http://unix.stackexchange.com/ $ urlencode -d "Example: %21, %22, . . . , %29 etc" Example: !, ", . . . , ) etc
Commenti
- Per il tutorial su
sed
visita - Questa è una cattiva soluzione, perché richiede lhardcoding di ogni carattere. Questo problema è esemplificato dal codice che manca della
%20
sequenza di escape. - @Overv I ‘ ho appena Rivisto
- Inoltre, potresti voler ricontrollare cosa fa
s/%26/&/g
. (Lho risolto.)
Risposta
Non posso “t commentare la migliore risposta in questo thread , quindi ecco la mia.
Personalmente, utilizzo questi alias per la codifica e la decodifica dellURL:
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])""
Entrambi i comandi consentono di convertire i dati, passati come argomento della riga di comando o di leggerli da standard input , perché entrambe le battute verificano se ci sono argomenti della riga di comando (anche vuoti) e li elaborano o semplicemente leggono input standard altrimenti.
aggiornamento 23/05/2017 (codifica barra)
In risposta al commento di @Bevor.
Se tu anche bisogno di codificare la barra, basta aggiungere un secondo argomento vuoto alla funzione quote, quindi anche la barra verrà codificata.
Quindi, finalmente urlencode
alias in bash ha questo aspetto:
alias urlencode="python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")""
Esame 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
Commenti
- Non codifica le barre.
- @Bevor : Esempio?
- Aggiungi una barra a urlencode ” Проба пера ” – > risultato: Slash non è codificato.
- @Bevor: hai ragione. Grazie per il tuo commento. Cambierò anche la mia risposta per riflettere il tuo commento al suo interno.
Risposta
GNU Awk
#!/usr/bin/awk -fn @include "ord" BEGIN { RS = "%.." } { printf "%s", $0 if (RT != "") { printf "%s", chr("0x" substr(RT, 2)) } }
Risposta
E un altro approccio Perl:
#!/usr/bin/env perl use URI::Encode; my $uri = URI::Encode->new( { encode_reserved => 0 } ); while (<>) { print $uri->decode($_) }
Dovrai installare il modulo URI::Encode
. Sulla mia Debian, potrei semplicemente eseguire
sudo apt-get install liburi-encode-perl
Quindi, ho eseguito lo script sopra su un file di prova contenente:
http://foo%21asd%23asd%24%26asd%27asd%28asd%29
Il risultato è stato (avevo salvato lo script come foo.pl
):
$ ./foo.pl http://foo!asd#asd$&asd"asd(asd)
Risposta
Una risposta nella shell (principalmente Posix):
$ input="%21%22" $ printf "`printf "%s\n" "$input" | sed -e "s/+/ /g" -e "s/%\(..\)/\\\\x\1/g"`" !"
Spiegazione:
-
-e "s/+/ /g
trasforma ogni+
nello spazio (come descritto nella norma di codifica URL) -
-e "s/%\(..\)/\\\\x\1/g"
trasforma ogni%XX
in\\xXX
. Si noti che uno di\
verrà rimosso citando le regole. - Il printf interno serve solo per passare linput a sed. Possiamo sostituirlo con qualsiasi altro meccanismo
- Il printf esterno interpreta le
\\xXX
sequenze e mostra il risultato.
Modifica:
Poiché %
deve sempre essere interpretato negli URL, è possibile semplificare questa risposta. Inoltre, penso che sia più pulito usare xargs
invece di backquotes (grazie a @josch).
$ input="%21%22+%25" $ printf "%s\n" "$input" | sed -e "s/+/ /g; s/%/\\x/g" | xargs -0 printf !" %
Sfortunatamente, (come ha notato @josch) nessuna di queste soluzioni è conforme a Posix poiché la \x
sequenza di escape non è definita in Posix.
Commenti
- Benvenuto in U & L. Forse potresti spiegare questa risposta e come funziona. In genere preferiamo che le nostre risposte siano lunghe con dettagli, non solo frammenti di codice.
- Mi piace molto questa risposta perché ‘ è completa, portabile e non ‘ t richiede programmi esterni più pesanti come perl o python. Funziona bene per me.
- Ottima soluzione. E ancora più breve e intelligente:
... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'
. Lopzione-e
può essere omessa qui infatti … - @josch Hai ragione,
printf
è un è integrato indash
e ‘ t riconosce\x
di escape. Puoi utilizzare/usr/bin/printf
invece diprintf
per farlo funzionare. Normalmente dovresti essere in grado di utilizzarecommand printf
, ma sembra che non funzioni come dovrebbe. Continua a utilizzare il built-in. - @Jezz infatti il supporto per
\x
escaping non fa parte di POSIX: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html Durante i miei test ho visto un altro problema. Potresti sostituire la tua..
regex con[a-zA-Z0-9][a-zA-Z0-9]
perché altrimenti inserisci ‘ %% % ‘ avrà esito negativo. Ho anche aggiuntos/%/%%/g
alla fine per assicurarmi di evitare le percentuali per printf.
Risposta
Unaltra soluzione che utilizza ruby (la risposta Python accettata non funzionava per me)
alias urldecode="ruby -e "require \"cgi\"; puts CGI.unescape(ARGV[0])"" alias urlencode="ruby -e "require \"cgi\"; puts CGI.escape(ARGV[0])""
Esempio
$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B
Commenti
- Appena usato per ruby, e queste istruzioni sembrano più piccole. Inoltre, sono passato a ARGF.read in modo da poterlo reindirizzare come faccio con molte altre utilità!
Answer
Ecco una funzione BASH per fare esattamente questo:
function urldecode() { echo -ne $(echo -n "$1" | sed -E "s/%/\\\\x/g") }
Commenti
- funziona come un fascino
- Se desideri convertire
+
caratteri in spazi e non generare processi, puoi utilizzare questo:: "${1//+/ }" && echo -e "${_//%/\\x}"
Answer
Solo shell:
$ x="a%20%25%e3%81%82";printf "${x//\%/\\x}" a %あ
Aggiungi --
o %b
per evitare che gli argomenti che iniziano con un trattino vengano trattati come opzioni.
In zsh ${x//%/a}
aggiunge a
alla fine ma ${x//\%/a}
sostituisce %
con a
.
Risposta
Ecco le parti rilevanti di un altro script (che ho spudoratamente rubato dal mio script di download di youtube.com da unaltra risposta) lho già scritto. Utilizza sed
e la shell per creare un urldecode funzionante.
set \! \" \# \$ \% \& \" \( \) \* \ \+ \, \/ \: \; \= \? \@ \[ \] for c do set "$@" ""$c" "$c"; shift; done curl -s "$url" | sed "s/\\u0026/\&/g;""$( printf "s/%%%X/\\%s/g;" "$@" )"
Non giuro che sia completo – e in effetti ne dubito – ma sicuramente ha gestito abbastanza YouTube.
Answer
La semplice soluzione per short stringhe (la shell è lentawww):
$ str="q+werty%3D%2F%3B" $ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n" q werty=/;