Ich möchte die URL-Codierung decodieren. Gibt es ein eingebautes Tool dafür oder könnte mir jemand einen sed
Code zur Verfügung stellen, der dies erledigt?
Ich habe ein bisschen unter unix.stackexchange.com und im Internet gesucht, aber ich konnte kein Befehlszeilentool zum Dekodieren der URL-Kodierung finden.
Was ich tun möchte, ist einfach vor Ort eine txt
Datei zu bearbeiten , so dass:
%21
wird!
%23
wird#
%24
wird$
%26
wird&
%27
wird'
%28
wird(
%29
wird)
Und so weiter.
shell-script
text-processing
sed
url
Anzeigename
quelle
quelle
Antworten:
Wir haben diese Python One-Liner gefunden, die genau das tun, was Sie wollen:
Beispiel
Verweise
quelle
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
standardmäßig 3 eingestellt ist, führt dies zu Fehlern. Wechselnpython
zupython2
hilft.python3
Sie könnenimport urllib.parse as ul
anstelle von verwendenimport urllib as ul
.sed
Versuchen Sie die folgende Befehlszeile:
oder die folgende Alternative mit
echo -e
:Hinweis: Die obige Syntax wird möglicherweise nicht
+
in Leerzeichen konvertiert und kann alle Zeilenumbrüche aufnehmen.Sie können es als Alias definieren und zu Ihren Shell- RC- Dateien hinzufügen :
Dann gehen Sie jedes Mal, wenn Sie es brauchen, einfach mit:
Bash
Bei der Skripterstellung können Sie die folgende Syntax verwenden:
Die obige Syntax behandelt Pluszeichen (
+
) jedoch nicht korrekt, sodass Sie sie durch Leerzeichen über ersetzen müssensed
.Sie können auch die folgenden verwenden
urlencode()
undurldecode()
Funktionen:Hier finden Sie eine ähnliche Joel-Version: https://github.com/sixarm/urldecode.sh
bash + xxd
Bash-Funktion mit
xxd
Tool:Gefunden in der Hauptdatei von cdown , auch bei stackoverflow .
PHP
Mit PHP können Sie den folgenden Befehl versuchen:
oder nur:
Verwendung
-R
für mehrzeilige Eingabe.Perl
In Perl können Sie verwenden
URI::Escape
.Oder um eine Datei zu verarbeiten:
awk
Versuchen Sie eine andere Lösung:
Hinweis: Der Parameter
-n
ist spezifisch für GNUawk
.Siehe: Verwenden von awk printf zum URL-Code von Text .
Dateinamen entschlüsseln
Wenn Sie die URL-Codierung aus den Dateinamen entfernen müssen, verwenden Sie das
deurlname
Tool vonrenameutils
(zdeurlname *.*
. B. ).Siehe auch:
Verbunden:
quelle
awk
: Da dies eine Bibliotheksfunktion nutztchr()
, besteht eine hohe Wahrscheinlichkeit, dass sie nur auf GNU awk (gawk
) funktioniert . In diesem Fall wird es jedoch kaum für POSIX jeden gleichwertig seinawk
, weil die-n
Option (so dass nichtdezimale Argumente) IST eine GNU -awk
Spezialität.sed
Code gibt mirxargs: argument line too long
eine Datei mit ≥2164 Zeilen.printf
nicht berücksichtigt, dass die URL möglicherweise Prozentzeichen wie "Escape" enthält%25
. Sie übergeben diese an printf, ohne sie für printf mit einem anderen Prozentzeichen wie zu maskieren%%
.local LC_ALL=C
oben, sonst werden alle breiten Zeichen (z. B. Japanisch, Chinesisch usw.) nicht richtig in Bytes aufgeteilt.Dafür gibt es in der Python-Standardbibliothek eine integrierte Funktion. In Python 2 ist es
urllib.unquote
.Oder um eine Datei zu verarbeiten:
In Python 3 ist es
urllib.parse.unquote
.Oder um eine Datei zu verarbeiten:
In Perl können Sie verwenden
URI::Escape
.Oder um eine Datei zu verarbeiten:
Wenn Sie sich an tragbare POSIX-Tools halten möchten, ist dies umständlich, da awk der einzige ernsthafte Kandidat ist, der keine hexadezimalen Zahlen parst. Siehe Verwenden von awk printf Text urldecode für Beispiele mit gemeinsamen awk - Implementierungen, einschließlich BusyBox.
quelle
Wenn Sie einen einfachen
sed
Befehl verwenden möchten, verwenden Sie Folgendes:Es ist jedoch praktischer, ein Skript wie das folgende zu erstellen
sedscript
:Führen
sed -f sedscript < old > new
Sie dann die gewünschte Ausgabe aus.Zur Erleichterung ist der Befehl
urlencode
auch direkt imgridsite-clients
Paket verfügbar , von dem aus (sudo apt-get install gridsite-clients
in Ubuntu / Debian-System) installiert werden kann .Beispiel für die Dekodierung einer URL:
quelle
sed
Besuch%20
Escape-Sequenz fehlt .s/%26/&/g
geschieht. (Ich habe es behoben.)Perl Einzeiler:
Beispiel:
quelle
GNU awk
Oder
Konvertiert die prozentcodierte Datei-URL in eine lokale Datei in Bash
quelle
Ich kann die beste Antwort in diesem Thread nicht kommentieren , also hier meine.
Persönlich verwende ich diese Aliase für die URL-Codierung und -Decodierung:
Mit beiden Befehlen können Sie Daten konvertieren, die als Befehlszeilenargument übergeben oder von der Standardeingabe gelesen wurden , da beide Einzeilen prüfen, ob Befehlszeilenargumente (auch leere) vorhanden sind, und diese verarbeiten oder die Standardeingabe einfach anderweitig lesen.
Update 23.05.2017 (Schrägstrichcodierung)
Als Antwort auf den Kommentar von @ Bevor.
Wenn Sie auch den Schrägstrich codieren müssen, fügen Sie der Anführungszeichenfunktion einfach ein leeres zweites Argument hinzu. Der Schrägstrich wird dann ebenfalls codiert.
Der
urlencode
Alias in der Bash sieht also so aus:Beispiel
quelle
Und noch ein Perl-Ansatz:
Sie müssen das
URI::Encode
Modul installieren . Auf meinem Debian konnte ich einfach laufenDann habe ich das obige Skript für eine Testdatei ausgeführt, die Folgendes enthält:
Das Ergebnis war (ich hatte das Skript gespeichert als
foo.pl
):quelle
Eine Antwort in (meistens Posix) Shell:
Erläuterung:
-e 's/+/ /g
transformiert jedes+
im Raum (wie in der url-encode Norm beschrieben)-e 's/%\(..\)/\\\\x\1/g'
transformiere jeden%XX
in\\xXX
. Beachten Sie, dass einer von\
durch Anführungszeichen entfernt wird.\\xXX
Sequenzen und zeigt das Ergebnis an.Bearbeiten:
Da
%
in URLs immer interpretiert werden sollte, ist es möglich, diese Antwort zu vereinfachen. Außerdem halte ich es für sauberer,xargs
anstelle von Backquotes zu verwenden (danke an @josch).Leider (wie @josch bemerkt hat) ist keine dieser Lösungen Posix-kompatibel, da die
\x
Escape-Reihenfolge in Posix nicht definiert ist.quelle
... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'
. Die-e
Option kann hier in der Tat weggelassen werden ...printf
ist ein eingebautesdash
und es erkennt kein\x
Entkommen. Sie können/usr/bin/printf
anstelle vonprintf
verwenden, damit es funktioniert. Normalerweise sollten Sie verwenden könnencommand printf
, aber es scheint nicht so zu funktionieren, wie es sollte. Es weiterhin eingebaute verwenden.\x
Flucht ist in der Tat kein Bestandteil 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 ersetzen,[a-zA-Z0-9][a-zA-Z0-9]
da andernfalls Eingaben wie '%%%' fehlschlagen. Ich habe auchs/%/%%/g
am Ende hinzugefügt , um sicherzustellen, dass Prozentsätze für printf nicht angezeigt werden.Nur Shell:
Fügen Sie
--
oder hinzu%b
, um zu verhindern, dass Argumente, die mit einem Bindestrich beginnen, als Optionen behandelt werden.In zsh
${x//%/a}
fügta
an das Ende , sondern${x//\%/a}
ersetzt%
mita
.quelle
Hier sind die relevanten Teile aus einem anderen Skript (das ich schamlos aus meinem youtube.com-Download-Skript aus einer anderen Antwort gestohlen habe ), die ich zuvor geschrieben habe. Es benutzt
sed
und die Shell, um einen funktionierenden URL-Code aufzubauen.Ich werde nicht schwören, dass es umfassend ist - und tatsächlich bezweifle ich es -, aber es hat mit Sicherheit genug mit YouTube zu tun.
quelle
Hier ist eine BASH-Funktion, um genau das zu tun:
quelle
Eine andere Lösung mit Ruby (akzeptierte Python-Antwort hat bei mir nicht funktioniert)
Beispiel
quelle