Ich möchte die URL-Kodierung entschlüsseln, gibt es dafür ein eingebautes Tool oder könnte mir jemand ein sed
Code, der dies tut?
Ich habe ein bisschen in unix.stackexchange.com und im Internet gesucht, aber ich konnte kein Befehlszeilen-Tool zum Dekodieren finden URL-Codierung.
Ich möchte einfach eine txt
-Datei so bearbeiten, dass:
-
%21
wird zu!
-
%23
wird zu#
-
%24
wird zu$
-
%26
wird zu&
-
%27
wird zu"
-
%28
wird zu(
-
%29
wird zu)
und so weiter.
Kommentare
Antwort
Es wurden diese Python-Einzeiler gefunden, die das tun, was Sie wollen:
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]))""
Beispiel
$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B
Referenzen
Kommentare
- Ich weiß das sehr spät , aber gibt es eine Möglichkeit, dies mit der Bearbeitung vor Ort zu tun?
- @DisplayName – klingt für mich wie ein neues Q. Ich ‚ würde es fragen und auf dieses verweisen.
- 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]"
- Siehe @DIG mbl ‚ s Antwort beblow für eine, die mit stdin funktioniert.
Antwort
sed
Versuchen Sie die folgende Befehlszeile:
$ sed "s@+@ @g;s@%@\\x@g" file | xargs -0 printf "%b"
oder die folgende Alternative mit echo -e
:
$ sed -e"s/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g" file | xargs echo -e
Hinweis: Die obige Syntax konvertiert möglicherweise nicht +
in Leerzeichen und kann alle Zeilenumbrüche essen.
Sie können es als Alias definieren und zu Ihren Shell- rc -Dateien hinzufügen:
$ alias urldecode="sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b""
Dann gehen Sie jedes Mal, wenn Sie es brauchen, einfach mit:
$ echo "http%3A%2F%2Fwww" | urldecode http://www
Bash
Beim Scripting können Sie die folgende Syntax verwenden:
input="http%3A%2F%2Fwww" decoded=$(printf "%b" "${input//%/\\x}")
Die obige Syntax behandelt jedoch keine Pluspunkte () korrekt, daher müssen Sie sie über sed
oder wie von @isaac vorgeschlagen, verwenden Sie die folgende Syntax:
decoded=$(input=${input//+/ }; printf "${input//%/\\x}")
Sie können auch die folgenden Funktionen urlencode()
und urldecode()
verwenden:
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}" }
Beachten Sie, dass oben
urldecode()
davon ausgeht, dass die Daten keinen Backslash enthalten.
Hier ist eine ähnliche Version von Joel: https://github.com/sixarm/urldecode.sh
bash + xxd
Bash-Funktion mit dem Tool 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 }
Gefunden in der Hauptdatei von cdown „, auch unter stackoverflow .
PHP
Mit PHP können Sie den folgenden Befehl ausführen:
$ echo oil+and+gas | php -r "echo urldecode(fgets(STDIN));" // Or: php://stdin oil and gas
oder einfach:
php -r "echo urldecode("oil+and+gas");"
Verwenden Sie -R
für die Eingabe mehrerer Zeilen.
Perl
In Perl du kann URI::Escape
verwenden.
decoded_url=$(perl -MURI::Escape -e "print uri_unescape($ARGV[0])" "$encoded_url")
Oder um eine Datei zu verarbeiten:
perl -i -MURI::Escape -e "print uri_unescape($ARGV[0])" file
awk
Versuchen Sie anon Lösung:
awk -niord "{printf RT?$0chr("0x"substr(RT,2)):$0}" RS=%..
Hinweis: Der Parameter -n
ist spezifisch für GNU awk
.
Siehe: Verwenden von awk printf zum URL-Code von Text .
Dateinamen dekodieren
Wenn Sie die URL-Kodierung aus den Dateinamen entfernen müssen, verwenden Sie das Tool deurlname
aus renameutils
(z deurlname *.*
).
Siehe auch:
- Kann Uri dekodieren Dateinamen beim Herunterladen im Stapel?
- Wie entferne ich die URI-Codierung aus Dateinamen?
Verwandte Themen:
- Wie dekodiere ich URL-codierte Zeichenfolgen in der Shell? bei SO
- Wie kann ich prozentual codierte Zeichenfolgen in der Befehlszeile codieren und decodieren? at Ask Ubuntu
Kommentare
-
awk
: Wie dies macht Bei Verwendung einer Bibliotheksfunktion,chr()
, besteht eine hohe Wahrscheinlichkeit, dass sie ausschließlich mit GNU awk funktioniert (gawk
). In diesem Fall gibt es jedoch kaum ein Äquivalent für POSIXawk
, da die Option-n
(die nicht dezimale Argumente zulässt) IST eine Spezialität von GNUawk
. - Ihre Lösungen mit
printf
berücksichtigen dies nicht Die URL enthält möglicherweise maskierte Prozentzeichen wie%25
. Sie übergeben diese an printf, ohne sie für printf mit einem anderen Prozentzeichen wie%%
zu maskieren. - Für die Bash-Version ist
local LC_ALL=C
oben, sonst werden alle breiten Zeichen (z. B. Japanisch, Chinesisch usw.) nicht richtig in Bytes unterteilt. - github.com/SixArm/ urlencode.sh
- Die printf-Versionen ‚ funktionieren bei Verwendung der BSD-Version von printf (z. B. macOS) nicht, funktionieren jedoch bei Verwendung von GNU Coreutils-Version.
Antwort
Dafür gibt es in der Python-Standardbibliothek eine integrierte Funktion. In Python 2 ist es urllib.unquote
.
decoded_url=$(python2 -c "import sys, urllib; print urllib.unquote(sys.argv[1])" "$encoded_url")
Oder um eine Datei zu verarbeiten:
python2 -c "import sys, urllib; print urllib.unquote(sys.stdin.read())" <file >file.new && mv -f file.new file
In Python 3 ist es urllib.parse.unquote
.
decoded_url=$(python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" "$encoded_url")
Oder um eine Datei zu verarbeiten:
python3 -c "import sys, urllib; print(urllib.parse.unquote(sys.stdin.read()))" <file >file.new && mv -f file.new file
In Perl können Sie URI::Escape
verwenden.
decoded_url=$(perl -MURI::Escape -e "print uri_unescape($ARGV[0])" "$encoded_url")
Oder um eine Datei zu verarbeiten:
perl -i -MURI::Escape -e "print uri_unescape($ARGV[0])" file
Wenn Sie sich an tragbare POSIX-Tools halten möchten, “ Es ist umständlich, weil der einzige ernsthafte Kandidat awk ist, der keine hexadezimalen Zahlen analysiert. Beispiele für gängige awk-Implementierungen, einschließlich BusyBox, finden Sie unter Verwenden von awk printf zum URL-Code .
Antwort
Perl einzeilig:
$ perl -pe "s/\%(\w\w)/chr hex $1/ge"
Beispiel:
$ echo "%21%22" | perl -pe "s/\%(\w\w)/chr hex $1/ge" !"
Kommentare
- Diese Antwort ist attraktiv, wenn Sie ‚ nicht mit der Installation von Perl-Modulen befassen möchten.
- Nur eine, die unter MacOS für mich elegant funktioniert hat.
- Wenn Sie alle Ebenen der URL-Codierung gleichzeitig auflösen möchten, gibt es ‚ s auch
perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);'
, das alle%25xx
verschachtelten Codierungen
Antwort
Wenn Sie einen einfältigen sed
-Befehl verwenden möchten, verwenden Sie Folgendes:
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"
Es ist jedoch bequemer, ein Skript wie (z. B. sedscript
) zu erstellen:
s/%21/!/g s/%23/#/g s/%24/$/g s/%26/\&/g s/%27/"/g s/%28/(/g s/%29/)/g
Führen Sie dann sed -f sedscript < old > new
aus, das wie gewünscht ausgegeben wird.
Der Einfachheit halber ist der Befehl urlencode
auch direkt in gridsite-clients
kann von (über sudo apt-get install gridsite-clients
im Ubuntu / Debian-System) installiert werden.
NAME
urlencode – Konvertiert Zeichenfolgen in oder aus einer URL-codierten Form.
ÜBERSICHT
urlencode [-m|-d] string [string ...]
BESCHREIBUNG
urlencode
codiert Zeichenfolgen gemäß RFC 1738.
Das heißt, Zeichen A
– Z
a
– z
0
– 9
.
_
und -
werden unverändert durchlaufen. Alle anderen Zeichen werden jedoch als% HH dargestellt, wobei HH ihre Zwei-D ist igit hexadezimale ASCII-Darstellung in Großbuchstaben. Beispielsweise wird die URL http://www.gridpp.ac.uk/
zu http%3A%2F%2Fwww.gridpp.ac.uk%2F
urlencode
konvertiert jedes Zeichen in allen Zeichenfolgen in der Befehlszeile. Wenn mehrere Zeichenfolgen angegeben werden, werden diese vor der Konvertierung mit getrennten Leerzeichen verknüpft. OPTIONEN
-m
Führen Sie anstelle der vollständigen Konvertierung die „milde URL-Codierung“ von GridSite durch. in dem AZ az 0-9. = – _ @ und / werden unverändert durchlaufen. Dies führt zu etwas besser lesbaren Zeichenfolgen, aber die Anwendung muss darauf vorbereitet sein, die Verzeichnisse zu erstellen oder zu simulieren, die durch Schrägstriche impliziert werden. -d
Führen Sie stattdessen eine URL-Dekodierung durch Laut HFC 1738 werden% HH- und% hh-Zeichenfolgen konvertiert und andere Zeichen unverändert durchlaufen, mit der Ausnahme, dass +
in Leerzeichen konvertiert wird.
Beispiel für die Dekodierung der URL:
$ urlencode -d "http%3a%2f%2funix.stackexchange.com%2f" http://unix.stackexchange.com/ $ urlencode -d "Example: %21, %22, . . . , %29 etc" Example: !, ", . . . , ) etc
Kommentare
- Ein Tutorial zu
sed
besuchen Sie
- Dies ist eine schlechte Lösung, da jedes Zeichen fest codiert werden muss. Dieses Problem wird durch Ihren Code veranschaulicht, dem die häufig verwendete Escape-Sequenz
%20
fehlt.
- @Overv Ich ‚ habe gerade Überarbeitet
- Vielleicht möchten Sie auch noch einmal überprüfen, was
s/%26/&/g
tut. (Ich habe es behoben.)
Antwort
Ich kann beste Antwort in diesem Thread , also hier ist meine.
Ich persönlich verwende diese Aliase für die URL-Codierung und -Decodierung:
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])""
Mit beiden Befehlen können Sie Daten konvertieren, die als Befehlszeilenargument übergeben oder von gelesen werden Standardeingabe , da beide Einzeiler prüfen, ob Befehlszeilenargumente vorhanden sind (auch leere) und diese verarbeiten oder nur lesen Andernfalls Standardeingabe.
Update 2017-05-23 (Schrägstrichcodierung)
Als Antwort auf den Kommentar von @Bevor.
Wenn Sie Sie müssen auch den Schrägstrich codieren. Fügen Sie der Anführungszeichenfunktion einfach ein leeres zweites Argument hinzu. Dann wird auch der Schrägstrich codiert.
Also schließlich urlencode
Alias in bash sieht folgendermaßen aus:
alias urlencode="python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")""
Prüfung 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
Kommentare
- Codiert keine Schrägstriche.
- @Bevor : Beispiel?
- Fügen Sie einen Schrägstrich zum Urlencode hinzu “ divроба пера “ – > Ergebnis: Schrägstrich ist nicht codiert.
- @Bevor: Sie haben Recht. Danke für deinen Kommentar. Ich werde auch meine Antwort ändern, um Ihren Kommentar darin wiederzugeben.
Antwort
GNU Awk
#!/usr/bin/awk -fn @include "ord" BEGIN { RS = "%.." } { printf "%s", $0 if (RT != "") { printf "%s", chr("0x" substr(RT, 2)) } }
Antwort
Und ein weiterer Perl-Ansatz:
#!/usr/bin/env perl use URI::Encode; my $uri = URI::Encode->new( { encode_reserved => 0 } ); while (<>) { print $uri->decode($_) }
Sie müssen das Modul URI::Encode
installieren. Auf meinem Debian konnte ich einfach
sudo apt-get install liburi-encode-perl
ausführen. Dann führte ich das obige Skript in einer Testdatei aus, die Folgendes enthielt:
http://foo%21asd%23asd%24%26asd%27asd%28asd%29
Das Ergebnis war (ich hatte das Skript als foo.pl
gespeichert):
$ ./foo.pl http://foo!asd#asd$&asd"asd(asd)
Antwort
Eine Antwort in der (meistens Posix-) Shell:
$ input="%21%22" $ printf "`printf "%s\n" "$input" | sed -e "s/+/ /g" -e "s/%\(..\)/\\\\x\1/g"`" !"
Erläuterung:
-
-e "s/+/ /g
transformiert jedes +
im Raum (wie in der URL-Codierungsnorm beschrieben)
-
-e "s/%\(..\)/\\\\x\1/g"
transformiere jedes %XX
in \\xXX
. Beachten Sie, dass \
durch Zitieren von Regeln entfernt wird.
- Der innere printf dient nur dazu, Eingaben an sed zu übergeben. Wir können es durch einen anderen Mechanismus ersetzen.
- Der äußere Druck interpretiert
\\xXX
Sequenzen und zeigt das Ergebnis an.
Bearbeiten:
Da %
immer in URLs interpretiert werden sollte, Es ist möglich, diese Antwort zu vereinfachen. Außerdem halte ich es für sauberer, xargs
anstelle von backquotes zu verwenden (dank @josch).
$ input="%21%22+%25" $ printf "%s\n" "$input" | sed -e "s/+/ /g; s/%/\\x/g" | xargs -0 printf !" %
Leider ist (wie @josch bemerkt hat) keine dieser Lösungen Posix-konform, da die \x
Escape-Sequenz in Posix nicht definiert ist.
Kommentare
- Willkommen bei U & L. Vielleicht könnten Sie diese Antwort erklären und wie es funktioniert. Wir bevorzugen im Allgemeinen, dass unsere Antworten in Langform mit Details und nicht nur Code-Schnipsel vorliegen.
- Diese Antwort gefällt mir sehr gut, da sie ‚ umfassend, portabel und nicht ‚ erfordert keine besonders schweren externen Programme wie Perl oder Python. Funktioniert gut für mich.
- Tolle Lösung. Und noch kürzer und intelligenter:
... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'
. Die Option -e
kann hier tatsächlich weggelassen werden …
- @josch Sie haben Recht,
printf
ist a Eingebautes dash
und ‚ erkennt nicht, dass \x
entkommt. Sie können /usr/bin/printf
anstelle von printf
verwenden, damit es funktioniert. Normalerweise sollten Sie in der Lage sein, command printf
zu verwenden, aber es scheint nicht so zu funktionieren, wie es sollte. Es wird weiterhin integriert verwendet.
- @Jezz unterstützt in der Tat die Unterstützung für
\x
Escape ist nicht Teil von POSIX: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html Während meiner Tests habe ich ein anderes Problem festgestellt. Möglicherweise möchten Sie Ihre ..
Regex durch [a-zA-Z0-9][a-zA-Z0-9]
ersetzen, da andernfalls ‚ %% eingegeben wird % ‚ schlägt fehl. Ich habe am Ende auch s/%/%%/g
hinzugefügt, um sicherzustellen, dass Prozentsätze für printf nicht berücksichtigt werden.
Antwort
Eine andere Lösung mit Ruby (akzeptierte Python-Antwort funktionierte bei mir nicht)
alias urldecode="ruby -e "require \"cgi\"; puts CGI.unescape(ARGV[0])"" alias urlencode="ruby -e "require \"cgi\"; puts CGI.escape(ARGV[0])""
Beispiel
$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B
Kommentare
- Wird nur für Ruby verwendet, und diese Anweisungen sehen kleiner aus. Außerdem habe ich zu ARGF.read gewechselt, damit ich es wie bei vielen anderen Dienstprogrammen einfügen kann!
Antwort
Hier ist eine BASH-Funktion, um genau das zu tun:
function urldecode() { echo -ne $(echo -n "$1" | sed -E "s/%/\\\\x/g") }
Kommentare
- funktioniert wie Charme
- Wenn Sie
+
Zeichen in konvertieren möchten Leerzeichen und keine Prozesse erzeugen, können Sie Folgendes verwenden: : "${1//+/ }" && echo -e "${_//%/\\x}"
Antwort
Nur Shell:
$ x="a%20%25%e3%81%82";printf "${x//\%/\\x}" a %あ
Fügen Sie --
oder %b
, um zu verhindern, dass Argumente, die mit einem Bindestrich beginnen, als Optionen behandelt werden.
In zsh ${x//%/a}
fügt am Ende a
hinzu, aber ${x//\%/a}
ersetzt %
durch a
.
Antwort
Hier sind die relevanten Bits aus einem anderen Skript (das ich nur schamlos mache gestohlen von meinem youtube.com-Download-Skript aus einer anderen Antwort) Ich habe zuvor geschrieben. Es verwendet sed
und die Shell, um einen funktionierenden URL-Code aufzubauen.
set \! \" \# \$ \% \& \" \( \) \* \ \+ \, \/ \: \; \= \? \@ \[ \] for c do set "$@" ""$c" "$c"; shift; done curl -s "$url" | sed "s/\\u0026/\&/g;""$( printf "s/%%%X/\\%s/g;" "$@" )"
Ich schwöre nicht, dass es umfassend ist – und tatsächlich bezweifle ich es – aber es hat YouTube sicher genug gehandhabt.
Antwort
Die einfache Lösung für kurze Zeichenfolgen (Shell ist langsam):
$ str="q+werty%3D%2F%3B" $ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n" q werty=/;
Wenn Sie einen einfältigen sed
-Befehl verwenden möchten, verwenden Sie Folgendes:
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"
Es ist jedoch bequemer, ein Skript wie (z. B. sedscript
) zu erstellen:
s/%21/!/g s/%23/#/g s/%24/$/g s/%26/\&/g s/%27/"/g s/%28/(/g s/%29/)/g
Führen Sie dann sed -f sedscript < old > new
aus, das wie gewünscht ausgegeben wird.
Der Einfachheit halber ist der Befehl urlencode
auch direkt in gridsite-clients
kann von (über sudo apt-get install gridsite-clients
im Ubuntu / Debian-System) installiert werden.
NAME
urlencode – Konvertiert Zeichenfolgen in oder aus einer URL-codierten Form.
ÜBERSICHT
urlencode [-m|-d] string [string ...]
BESCHREIBUNG
urlencode
codiert Zeichenfolgen gemäß RFC 1738.Das heißt, Zeichen
A
–Z
a
–z
0
–9
.
_
und-
werden unverändert durchlaufen. Alle anderen Zeichen werden jedoch als% HH dargestellt, wobei HH ihre Zwei-D ist igit hexadezimale ASCII-Darstellung in Großbuchstaben. Beispielsweise wird die URLhttp://www.gridpp.ac.uk/
zuhttp%3A%2F%2Fwww.gridpp.ac.uk%2F
urlencode
konvertiert jedes Zeichen in allen Zeichenfolgen in der Befehlszeile. Wenn mehrere Zeichenfolgen angegeben werden, werden diese vor der Konvertierung mit getrennten Leerzeichen verknüpft. OPTIONEN
-m
Führen Sie anstelle der vollständigen Konvertierung die „milde URL-Codierung“ von GridSite durch. in dem AZ az 0-9. = – _ @ und / werden unverändert durchlaufen. Dies führt zu etwas besser lesbaren Zeichenfolgen, aber die Anwendung muss darauf vorbereitet sein, die Verzeichnisse zu erstellen oder zu simulieren, die durch Schrägstriche impliziert werden.
-d
Führen Sie stattdessen eine URL-Dekodierung durch Laut HFC 1738 werden% HH- und% hh-Zeichenfolgen konvertiert und andere Zeichen unverändert durchlaufen, mit der Ausnahme, dass
+
in Leerzeichen konvertiert wird.
Beispiel für die Dekodierung der URL:
$ urlencode -d "http%3a%2f%2funix.stackexchange.com%2f" http://unix.stackexchange.com/ $ urlencode -d "Example: %21, %22, . . . , %29 etc" Example: !, ", . . . , ) etc
Kommentare
- Ein Tutorial zu
sed
besuchen Sie - Dies ist eine schlechte Lösung, da jedes Zeichen fest codiert werden muss. Dieses Problem wird durch Ihren Code veranschaulicht, dem die häufig verwendete Escape-Sequenz
%20
fehlt. - @Overv Ich ‚ habe gerade Überarbeitet
- Vielleicht möchten Sie auch noch einmal überprüfen, was
s/%26/&/g
tut. (Ich habe es behoben.)
Antwort
Ich kann beste Antwort in diesem Thread , also hier ist meine.
Ich persönlich verwende diese Aliase für die URL-Codierung und -Decodierung:
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])""
Mit beiden Befehlen können Sie Daten konvertieren, die als Befehlszeilenargument übergeben oder von gelesen werden Standardeingabe , da beide Einzeiler prüfen, ob Befehlszeilenargumente vorhanden sind (auch leere) und diese verarbeiten oder nur lesen Andernfalls Standardeingabe.
Update 2017-05-23 (Schrägstrichcodierung)
Als Antwort auf den Kommentar von @Bevor.
Wenn Sie Sie müssen auch den Schrägstrich codieren. Fügen Sie der Anführungszeichenfunktion einfach ein leeres zweites Argument hinzu. Dann wird auch der Schrägstrich codiert.
Also schließlich urlencode
Alias in bash sieht folgendermaßen aus:
alias urlencode="python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")""
Prüfung 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
Kommentare
- Codiert keine Schrägstriche.
- @Bevor : Beispiel?
- Fügen Sie einen Schrägstrich zum Urlencode hinzu “ divроба пера “ – > Ergebnis: Schrägstrich ist nicht codiert.
- @Bevor: Sie haben Recht. Danke für deinen Kommentar. Ich werde auch meine Antwort ändern, um Ihren Kommentar darin wiederzugeben.
Antwort
GNU Awk
#!/usr/bin/awk -fn @include "ord" BEGIN { RS = "%.." } { printf "%s", $0 if (RT != "") { printf "%s", chr("0x" substr(RT, 2)) } }
Antwort
Und ein weiterer Perl-Ansatz:
#!/usr/bin/env perl use URI::Encode; my $uri = URI::Encode->new( { encode_reserved => 0 } ); while (<>) { print $uri->decode($_) }
Sie müssen das Modul URI::Encode
installieren. Auf meinem Debian konnte ich einfach
sudo apt-get install liburi-encode-perl
ausführen. Dann führte ich das obige Skript in einer Testdatei aus, die Folgendes enthielt:
http://foo%21asd%23asd%24%26asd%27asd%28asd%29
Das Ergebnis war (ich hatte das Skript als foo.pl
gespeichert):
$ ./foo.pl http://foo!asd#asd$&asd"asd(asd)
Antwort
Eine Antwort in der (meistens Posix-) Shell:
$ input="%21%22" $ printf "`printf "%s\n" "$input" | sed -e "s/+/ /g" -e "s/%\(..\)/\\\\x\1/g"`" !"
Erläuterung:
-
-e "s/+/ /g
transformiert jedes+
im Raum (wie in der URL-Codierungsnorm beschrieben) -
-e "s/%\(..\)/\\\\x\1/g"
transformiere jedes%XX
in\\xXX
. Beachten Sie, dass\
durch Zitieren von Regeln entfernt wird. - Der innere printf dient nur dazu, Eingaben an sed zu übergeben. Wir können es durch einen anderen Mechanismus ersetzen.
- Der äußere Druck interpretiert
\\xXX
Sequenzen und zeigt das Ergebnis an.
Bearbeiten:
Da %
immer in URLs interpretiert werden sollte, Es ist möglich, diese Antwort zu vereinfachen. Außerdem halte ich es für sauberer, xargs
anstelle von backquotes zu verwenden (dank @josch).
$ input="%21%22+%25" $ printf "%s\n" "$input" | sed -e "s/+/ /g; s/%/\\x/g" | xargs -0 printf !" %
Leider ist (wie @josch bemerkt hat) keine dieser Lösungen Posix-konform, da die \x
Escape-Sequenz in Posix nicht definiert ist.
Kommentare
- Willkommen bei U & L. Vielleicht könnten Sie diese Antwort erklären und wie es funktioniert. Wir bevorzugen im Allgemeinen, dass unsere Antworten in Langform mit Details und nicht nur Code-Schnipsel vorliegen.
- Diese Antwort gefällt mir sehr gut, da sie ‚ umfassend, portabel und nicht ‚ erfordert keine besonders schweren externen Programme wie Perl oder Python. Funktioniert gut für mich.
- Tolle Lösung. Und noch kürzer und intelligenter:
... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'
. Die Option-e
kann hier tatsächlich weggelassen werden … - @josch Sie haben Recht,
printf
ist a Eingebautesdash
und ‚ erkennt nicht, dass\x
entkommt. Sie können/usr/bin/printf
anstelle vonprintf
verwenden, damit es funktioniert. Normalerweise sollten Sie in der Lage sein,command printf
zu verwenden, aber es scheint nicht so zu funktionieren, wie es sollte. Es wird weiterhin integriert verwendet. - @Jezz unterstützt in der Tat die Unterstützung für
\x
Escape ist nicht Teil von POSIX: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html Während meiner Tests habe ich ein anderes Problem festgestellt. Möglicherweise möchten Sie Ihre..
Regex durch[a-zA-Z0-9][a-zA-Z0-9]
ersetzen, da andernfalls ‚ %% eingegeben wird % ‚ schlägt fehl. Ich habe am Ende auchs/%/%%/g
hinzugefügt, um sicherzustellen, dass Prozentsätze für printf nicht berücksichtigt werden.
Antwort
Eine andere Lösung mit Ruby (akzeptierte Python-Antwort funktionierte bei mir nicht)
alias urldecode="ruby -e "require \"cgi\"; puts CGI.unescape(ARGV[0])"" alias urlencode="ruby -e "require \"cgi\"; puts CGI.escape(ARGV[0])""
Beispiel
$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B
Kommentare
- Wird nur für Ruby verwendet, und diese Anweisungen sehen kleiner aus. Außerdem habe ich zu ARGF.read gewechselt, damit ich es wie bei vielen anderen Dienstprogrammen einfügen kann!
Antwort
Hier ist eine BASH-Funktion, um genau das zu tun:
function urldecode() { echo -ne $(echo -n "$1" | sed -E "s/%/\\\\x/g") }
Kommentare
- funktioniert wie Charme
- Wenn Sie
+
Zeichen in konvertieren möchten Leerzeichen und keine Prozesse erzeugen, können Sie Folgendes verwenden:: "${1//+/ }" && echo -e "${_//%/\\x}"
Antwort
Nur Shell:
$ x="a%20%25%e3%81%82";printf "${x//\%/\\x}" a %あ
Fügen Sie --
oder %b
, um zu verhindern, dass Argumente, die mit einem Bindestrich beginnen, als Optionen behandelt werden.
In zsh ${x//%/a}
fügt am Ende a
hinzu, aber ${x//\%/a}
ersetzt %
durch a
.
Antwort
Hier sind die relevanten Bits aus einem anderen Skript (das ich nur schamlos mache gestohlen von meinem youtube.com-Download-Skript aus einer anderen Antwort) Ich habe zuvor geschrieben. Es verwendet sed
und die Shell, um einen funktionierenden URL-Code aufzubauen.
set \! \" \# \$ \% \& \" \( \) \* \ \+ \, \/ \: \; \= \? \@ \[ \] for c do set "$@" ""$c" "$c"; shift; done curl -s "$url" | sed "s/\\u0026/\&/g;""$( printf "s/%%%X/\\%s/g;" "$@" )"
Ich schwöre nicht, dass es umfassend ist – und tatsächlich bezweifle ich es – aber es hat YouTube sicher genug gehandhabt.
Antwort
Die einfache Lösung für kurze Zeichenfolgen (Shell ist langsam):
$ str="q+werty%3D%2F%3B" $ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n" q werty=/;