sed
Pruebe la siguiente línea de comando:
$ sed 's@+@ @g;s@%@\\x@g' file | xargs -0 printf "%b"
o la siguiente alternativa usando echo -e
:
$ sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' file | xargs echo -e
Nota: es posible que la sintaxis anterior no se convierta +
en espacios, y puede comer todas las nuevas líneas.
Puede definirlo como alias y agregarlo a sus archivos rc de shell :
$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'
Luego, cada vez que lo necesite, simplemente vaya con:
$ echo "http%3A%2F%2Fwww" | urldecode
http://www
Golpetazo
Al crear secuencias de comandos, puede usar la siguiente sintaxis:
input="http%3A%2F%2Fwww"
decoded=$(printf '%b' "${input//%/\\x}")
Sin embargo, la sintaxis anterior no manejará más ( +
) correctamente, por lo que debe reemplazarlos con espacios a través de sed
.
También puede usar lo siguiente urlencode()
y las urldecode()
funciones:
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}"
}
Tenga en cuenta que lo anterior urldecode()
supone que los datos no contienen barra invertida.
Aquí hay una versión similar de Joel que se encuentra en: https://github.com/sixarm/urldecode.sh
bash + xxd
Función bash con xxd
herramienta:
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
}
Se encuentra en el archivo GIST de Cdown , también en stackoverflow .
PHP
Usando PHP puedes probar el siguiente comando:
$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Or: php://stdin
oil and gas
o solo:
php -r 'echo urldecode("oil+and+gas");'
Úselo -R
para entrada de línea múltiple.
Perl
En Perl puedes usar URI::Escape
.
decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")
O para procesar un archivo:
perl -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file
awk
Trate anon solución:
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
Nota: El parámetro -n
es específico de GNU awk
.
Consulte: Uso de awk printf para codificar el texto .
decodificar nombres de archivo
Si necesita eliminar la codificación de URL de los nombres de archivo, use la deurlname
herramienta de renameutils
(p deurlname *.*
. Ej .).
Ver también:
Relacionado: