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 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 :
$ 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
Bei der Skripterstellung können Sie die folgende Syntax verwenden:
input="http%3A%2F%2Fwww"
decoded=$(printf '%b' "${input//%/\\x}")
Die obige Syntax behandelt Pluszeichen ( +
) jedoch nicht korrekt, sodass Sie sie durch Leerzeichen über ersetzen müssen sed
.
Sie können auch die folgenden verwenden urlencode()
und urldecode()
Funktionen:
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 ausgegangen wird, dass die Daten keinen Backslash enthalten.
Hier finden Sie eine ähnliche Joel-Version: https://github.com/sixarm/urldecode.sh
bash + xxd
Bash-Funktion mit xxd
Tool:
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 bei stackoverflow .
PHP
Mit PHP können Sie den folgenden Befehl versuchen:
$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Or: php://stdin
oil and gas
oder nur:
php -r 'echo urldecode("oil+and+gas");'
Verwendung -R
für mehrzeilige Eingabe.
Perl
In Perl können Sie verwenden URI::Escape
.
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 eine andere 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 entschlüsseln
Wenn Sie die URL-Codierung aus den Dateinamen entfernen müssen, verwenden Sie das deurlname
Tool von renameutils
(z deurlname *.*
. B. ).
Siehe auch:
Verbunden: