Wie dekodiert man eine URL-codierte Zeichenfolge in der Shell?
Ich habe eine Datei mit einer Liste von user-agents, die codiert sind.
E. g.:
Mozilla%2F5.0%20%28Macintosh%3B%20U%3B%20Intel%20Mac%20OS%20X%2010.6%3B%20en
Ich möchte ein shell-script kann diese Datei Lesen und schreiben in eine neue Datei mit dem entschlüsselten strings.
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en
Habe ich versucht, dieses Beispiel zu verwenden, um es zu bekommen zu gehen, aber es ist nicht so weit.
$ echo -e "$(echo "%31+%32%0A%33+%34" | sed 'y/+//; s/%/\\x/g')"
Mein Skript sieht wie folgt aus:
#!/bin/bash
for f in *.log; do
echo -e "$(cat $f | sed 'y/+//; s/%/\x/g')" > y.log
done
InformationsquelleAutor der Frage user785717 | 2011-06-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine einfache ein-line-Lösung.
Es vielleicht so Aussehen mag perl : -) aber es ist nur der Reine bash. Keine awks, keine seds ... keine Gemeinkosten. Über die : builtin spezielle Parameter, Muster substitution und der echo-builtin ist option-e übersetzt hex-codes in Zeichen. Siehe bash - manpage für weitere details. Mit dieser Funktion können Sie als separaten Befehl
oder in Variablenzuweisungen, zum Beispiel so:
InformationsquelleAutor der Antwort guest
GNU awk
Oder
Mit awk printf (), urldecode text
InformationsquelleAutor der Antwort Steven Penny
Dies ist, was scheint zu funktionieren für mich.
Ersetzen '+'s mit Leerzeichen und % - Zeichen mit '\x' entweicht, und lassen echo interpretieren die \x entkommt, indem man das '-e' - option nicht funktioniert. Aus irgendeinem Grund, den cat-Befehl gedruckt wurde das % - Zeichen als eigene codierte form %25. So sed war einfach Auswechseln %25 mit \x25. Wenn Sie die option-e verwendet wurde, es war einfach bewerten \x25%, und der Ausgang war der gleiche wie das original.
Trace:
Original: Mozilla%2F5.0%20%28Macintosh%3B - %20U%3B%20Intel%20Mac%20OS%20X%2010.6%3B%20en
sed: Mozilla\x252F5.0\x2520\x2528Macintosh\x253B\x2520U\x253B\x2520Intel\x2520Mac\x2520OS\x2520X\x252010.6\x253B\x2520en
echo -e: Mozilla%2F5.0%20%28Macintosh%3B - %20U%3B%20Intel%20Mac%20OS%20X%2010.6%3B%20en
Update: Grundsätzlich ignorieren, die 2 Zeichen nach dem % in der sed.
sed: Mozilla\x2F5.0\x20 - \x28Macintosh\x3B\x20U\x3B\x20Intel\x20Mac\x20OS\x20X\x2010.6\x3B\x20en
echo -e: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; de
Nicht sicher, welche Komplikationen dies führen würde, nach umfangreichen Tests, arbeitet aber für jetzt.
InformationsquelleAutor der Antwort user785717
Mit
-i
updates die Dateien in-place (einigesed
Implementierungen geliehen haben, vonperl
) mit.back
als backup-Erweiterung.s/x/y/e
ersetztx
mit der eBewertung desy
perl-code.Den perl-code in diesem Fall verwendet
pack
zu packen, um die hex-Zahl gefangen in$1
(erste paar Klammern in regexp) als das entsprechende Zeichen.Alternative zu
pack
ist die Verwendungchr(hex($1))
:Falls verfügbar, können Sie auch
uri_unescape()
ausURI::Escape
:InformationsquelleAutor der Antwort Stephane Chazelas
Bash-Skript, es zu tun im einheitlichen Bash (original source):
Wenn Sie möchten, urldecode Inhalt der Datei, legen Sie einfach den Inhalt der Datei als argument.
Hier ist ein test, der läuft halt, wenn der decodiert codierte Datei Inhalt unterscheidet sich (wenn es läuft für ein paar Sekunden, das script funktioniert wahrscheinlich nicht richtig):
InformationsquelleAutor der Antwort Janus Troelsen
Als @barti_ddu sagte in den Kommentaren,
\x
"sollte [Doppel-]escaped" werden.Eher als Vermischung der Bash und sed würde ich das ganze in Python. Hier ein rough cut, wie:
InformationsquelleAutor der Antwort Johnsyweb
Mit der BASH zu Lesen, der Prozent-codierte URL von standard-und entschlüsseln:
Drücken Sie STRG-Dum zu signalisieren das Ende der Datei(EOF) und beenden Sie ordnungsgemäß.
Können Sie entschlüsseln des Inhalts einer Datei, indem Sie die Datei standard:
Können Sie die decode-input aus einer pipe entweder, zum Beispiel:
REPLY
gleich die Textzeile, in der es nur Lesen.${REPLY//%/\\x}
ersetzt alle Instanzen von '%' mit '\x'.echo -e
interpretiert\xNN
als das ASCII-Zeichen mit dem hexadezimalen WertNN
.Diese nicht ändern '+'''. Das können Hinzugefügt werden, wie in Gast Antwort. Dadurch wird nur die BASH und nicht anfängt, jeder andere Prozess, ähnlich der Gast seine Antwort.
InformationsquelleAutor der Antwort brendan
Wenn Sie php auf Ihrem server installiert ist, können Sie "Katze" oder auch "Schwanz" eine Datei mit url-kodierte strings sehr einfach.
InformationsquelleAutor der Antwort Oleg Bondar'
wenn Sie ein python Entwickler, das vielleicht preferer
das urllib ist Profi bei der Handhabung
InformationsquelleAutor der Antwort Jay
Mit GNU
awk
:InformationsquelleAutor der Antwort Stephane Chazelas
Hier ist eine Lösung, erfolgt in reiner bash, wo Eingang und Ausgang sind bash-Variablen. Es decodieren und '+' als Raum und Griff die '%20' Leerzeichen, wie auch die anderen %-codierte Zeichen.
InformationsquelleAutor der Antwort nevertooloud
InformationsquelleAutor der Antwort guest
Erweiterung
https://stackoverflow.com/a/37840948/8142470
arbeiten mit HTML-entities
(argument muss angegeben werden)
InformationsquelleAutor der Antwort Calvin Kim
Vor einem ähnlichen problem, meine ursprüngliche Idee war, mit urldecode von PHP in einem script, das Lesen von stdin oder einige-solche, aber dann stieß ich auf diese Idee. Alle Antworten zu haben scheinen, eine Menge text, aber keine wirkliche Lösung. Die Idee ist solide aber, und unglaublich einfach zu bekommen arbeiten:
Den Schlüssel zu arbeiten, ist die Doppel-Flucht \x (dies wurde bereits erwähnt).
InformationsquelleAutor der Antwort Ярослав Рахматуллин
Wollte nur zu teilen, diese andere Lösung, Reine bash:
InformationsquelleAutor der Antwort jamp
Einer leicht modifizierten version der Python-Antwort akzeptiert eine Eingabe-und Ausgabe-Datei in einem one-liner.
InformationsquelleAutor der Antwort Peter
InformationsquelleAutor der Antwort guest