Quiero decodificar la codificación de URL, ¿hay alguna herramienta incorporada para hacer esto o alguien podría proporcionarme un sed
¿código que hará esto?
Busqué un poco en unix.stackexchange.com y en Internet, pero no pude encontrar ninguna herramienta de línea de comandos para decodificar codificación de URL.
Lo que quiero hacer es simplemente editar un archivo txt
para que:
-
%21
se convierte en!
-
%23
se convierte en#
-
%24
se convierte en$
-
%26
se convierte en&
-
%27
se convierte en"
-
%28
se convierte en(
-
%29
se convierte en)
Y así sucesivamente.
Comentarios
- stackoverflow.com/questions/6250698/…
Respuesta
Encontré estos conceptos básicos de Python que hacen lo que quieres:
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]))""
Ejemplo
$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B
Referencias
Comentarios
- Lo sé muy tarde , pero ¿hay alguna forma de que pueda hacer esto con la edición en el lugar?
- @DisplayName – suena como una nueva Q para mí. Yo ‘ lo pregunto y hago referencia a este.
- 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]"
- Vea la respuesta de @DIG mbl ‘ s baja para una que funcione con stdin.
Respuesta
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 convierta +
a espacios, y puede comerse todas las líneas nuevas.
Puede definirlo como alias y agregarlo a sus archivos shell rc :
$ 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
Bash
Al crear scripts, puede utilizar la siguiente sintaxis:
input="http%3A%2F%2Fwww" decoded=$(printf "%b" "${input//%/\\x}")
Sin embargo, la sintaxis anterior no «no maneja las ventajas (+
) correctamente, por lo que debe reemplazarlos con espacios a través de sed
o como lo sugiere @isaac , use la siguiente sintaxis:
decoded=$(input=${input//+/ }; printf "${input//%/\\x}")
También puede utilizar las siguientes funciones urlencode()
y urldecode()
:
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 el
urldecode()
anterior asume 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 }
Encontrado en cdown «s gist file , también en stackoverflow .
PHP
Usando PHP puede probar el siguiente comando:
$ echo oil+and+gas | php -r "echo urldecode(fgets(STDIN));" // Or: php://stdin oil and gas
o simplemente:
php -r "echo urldecode("oil+and+gas");"
Utilice -R
para la entrada de varias líneas.
Perl
En Perl usted puede 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
Pruebe 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 texto con url .
decodificación de nombres de archivos
Si necesita eliminar la codificación de URL de los nombres de archivos, utilice la herramienta deurlname
de renameutils
(p. ej. deurlname *.*
).
Consulte también:
- Puede wget decodificar uri nombres de archivos al descargarlos por lotes?
- ¿Cómo eliminar la codificación URI de los nombres de archivos?
Relacionado:
- ¿Cómo decodificar cadenas codificadas en URL en shell? en SO
- ¿Cómo puedo codificar y decodificar cadenas codificadas en porcentaje en la línea de comandos? en Ask Ubuntu
Comentarios
-
awk
: ya que esto hace uso de una función de biblioteca,chr()
, existe una alta probabilidad de que funcione únicamente en GNU awk (gawk
). Sin embargo, en este caso, apenas habrá ningún equivalente para POSIXawk
, porque la opción-n
(que permite argumentos no decimales) ES unaawk
especialidad de GNU. - Sus soluciones que involucran
printf
no toman en cuenta que la URL puede contener signos de porcentaje de escape como%25
. Los pasa a printf sin escapar de ellos para printf con otro signo de porcentaje como%%
. - La versión bash requiere
local LC_ALL=C
en la parte superior; de lo contrario, todos los caracteres anchos (es decir, japonés, chino, etc.) no se dividen correctamente en bytes. - github.com/SixArm/ urlencode.sh
- Las versiones de printf no ‘ no funcionan cuando se usa la versión BSD de printf (por ejemplo, macOS), sin embargo, funciona bien cuando se usa el Versión GNU Coreutils.
Respuesta
Hay una función incorporada para eso en la biblioteca estándar de Python. En Python 2, es «s urllib.unquote
.
decoded_url=$(python2 -c "import sys, urllib; print urllib.unquote(sys.argv[1])" "$encoded_url")
O para procesar un archivo:
python2 -c "import sys, urllib; print urllib.unquote(sys.stdin.read())" <file >file.new && mv -f file.new file
En Python 3, es «s urllib.parse.unquote
.
decoded_url=$(python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" "$encoded_url")
O para procesar un archivo:
python3 -c "import sys, urllib; print(urllib.parse.unquote(sys.stdin.read()))" <file >file.new && mv -f file.new file
En Perl puede 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
Si desea utilizar las herramientas portátiles POSIX, » Es incómodo, porque el único candidato serio es awk, que no analiza números hexadecimales. Consulte Uso de awk printf para codificar texto en URL para ver ejemplos con implementaciones de awk comunes, incluido BusyBox.
Respuesta
Perl one liner:
$ perl -pe "s/\%(\w\w)/chr hex $1/ge"
Ejemplo:
$ echo "%21%22" | perl -pe "s/\%(\w\w)/chr hex $1/ge" !"
Comentarios
- Esta respuesta es atractiva cuando no ‘ no quiere ocuparse de la instalación de módulos perl.
- Solo uno que funcionó elegantemente para mí en MacOS.
- Si desea resolver todos los niveles de codificación de URL a la vez, hay ‘ s también
perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);'
que decodificará todas las%25xx
codificaciones anidadas
Respuesta
Si desea utilizar un comando sed
simplista, utilice lo siguiente:
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"
Pero es más conveniente crear un script como (digamos sedscript
):
s/%21/!/g s/%23/#/g s/%24/$/g s/%26/\&/g s/%27/"/g s/%28/(/g s/%29/)/g
Luego, ejecute sed -f sedscript < old > new
, que generará la salida que desee.
Para mayor facilidad, el comando urlencode
también está disponible directamente en gridsite-clients
se puede instalar desde (por sudo apt-get install gridsite-clients
en el sistema Ubuntu / Debian).
NAME
urlencode – convierte cadenas hacia o desde un formato codificado en URL
SINOPSIS
urlencode [-m|-d] string [string ...]
DESCRIPCIÓN
urlencode
codifica cadenas de acuerdo con RFC 1738.Es decir, caracteres
A
–Z
a
–z
0
–9
.
_
y-
se pasan sin modificar, pero todos los demás caracteres se representan como% HH, donde HH es su dos-d igit representación ASCII hexadecimal en mayúsculas. Por ejemplo, la URLhttp://www.gridpp.ac.uk/
se convierte enhttp%3A%2F%2Fwww.gridpp.ac.uk%2F
urlencode
convierte cada carácter en todas las cadenas dadas en la línea de comando. Si se proporcionan varias cadenas, se concatenan con espacios de separación antes de la conversión.OPCIONES
-m
En lugar de la conversión completa, utilice GridSite «codificación de URL moderada» en el que AZ az 0-9. = – _ @ y / se pasan sin modificar. Esto da como resultado cadenas un poco más legibles por humanos, pero la aplicación debe estar preparada para crear o simular los directorios implícitos en las barras.
-d
Realice la decodificación de URL en lugar de que la codificación, de acuerdo con RFC 1738. Las cadenas% HH y% hh se convierten y otros caracteres se pasan sin modificar, con la excepción de que
+
se convierte en espacio.
Ejemplo de decodificación de URL:
$ urlencode -d "http%3a%2f%2funix.stackexchange.com%2f" http://unix.stackexchange.com/ $ urlencode -d "Example: %21, %22, . . . , %29 etc" Example: !, ", . . . , ) etc
Comentarios
- Para obtener un tutorial sobre
sed
visite - Esta es una mala solución, porque requiere codificar cada carácter. Este problema se ejemplifica por el hecho de que en su código falta la secuencia de escape
%20
de uso frecuente. - @Overv I ‘ ve sólo Revisado
- Además, es posible que desee volver a verificar qué hace
s/%26/&/g
. (Lo arreglé.)
Respuesta
No puedo comentar sobre la mejor respuesta en este hilo , así que aquí está la mía.
Personalmente, uso estos alias para codificar y decodificar URL:
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])""
Ambos comandos le permiten convertir datos, pasados como un argumento de línea de comando o leerlos desde entrada estándar , porque ambos conceptos básicos comprueban si hay argumentos en la línea de comandos (incluso vacíos) y los procesan o simplemente leen entrada estándar de lo contrario.
actualización 2017-05-23 (codificación de barra)
En respuesta al comentario de @Bevor.
Si también es necesario codificar la barra, solo agregue un segundo argumento vacío a la función de comillas, luego la barra también se codificará.
Entonces, finalmente urlencode
alias en bash se ve así:
alias urlencode="python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")""
Examen 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
Comentarios
- No codifica barras.
- @Bevor : ¿Ejemplo?
- Agregar una barra al código urlen » Проба пера » – > resultado: la barra no está codificada.
- @Bevor: Tienes razón. Gracias por tu comentario. También cambiaré mi respuesta para reflejar su comentario en ella.
Respuesta
GNU Awk
#!/usr/bin/awk -fn @include "ord" BEGIN { RS = "%.." } { printf "%s", $0 if (RT != "") { printf "%s", chr("0x" substr(RT, 2)) } }
Respuesta
Y otro enfoque de Perl:
#!/usr/bin/env perl use URI::Encode; my $uri = URI::Encode->new( { encode_reserved => 0 } ); while (<>) { print $uri->decode($_) }
Necesitará instalar el módulo URI::Encode
. En mi Debian, simplemente podría ejecutar
sudo apt-get install liburi-encode-perl
Luego, ejecuté el script anterior en un archivo de prueba que contenía:
http://foo%21asd%23asd%24%26asd%27asd%28asd%29
El resultado fue (había guardado el script como foo.pl
):
$ ./foo.pl http://foo!asd#asd$&asd"asd(asd)
Respuesta
Una respuesta en (principalmente Posix) shell:
$ input="%21%22" $ printf "`printf "%s\n" "$input" | sed -e "s/+/ /g" -e "s/%\(..\)/\\\\x\1/g"`" !"
Explicación:
-
-e "s/+/ /g
transforma cada+
en el espacio (como se describe en la norma de codificación de URL) -
-e "s/%\(..\)/\\\\x\1/g"
transforma cada%XX
en\\xXX
. Observe que uno de\
se eliminará citando reglas. - El printf interno está ahí para pasar la entrada a sed. Podemos reemplazarlo por cualquier otro mecanismo
- El printf externo interpreta
\\xXX
secuencias y muestra el resultado.
Editar:
Dado que %
siempre debe interpretarse en URL, es posible simplificar esta respuesta. Además, creo que es más limpio usar xargs
en lugar de backquotes (gracias a @josch).
$ input="%21%22+%25" $ printf "%s\n" "$input" | sed -e "s/+/ /g; s/%/\\x/g" | xargs -0 printf !" %
Desafortunadamente, (como notó @josch) ninguna de estas soluciones es compatible con Posix ya que la secuencia de escape \x
no está definida en Posix.
Comentarios
- Bienvenido a U & L. Quizás podrías explicar esta respuesta y cómo funciona. Por lo general, preferimos que nuestras respuestas sean extensas con detalles, no solo fragmentos de código.
- Me gusta mucho esta respuesta porque ‘ es completa, portátil y no ‘ t requiere programas externos más pesados como perl o python. Funciona bien para mí.
- Gran solución. E incluso más corto e inteligente:
... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'
. De hecho, la opción-e
se puede omitir aquí … - @josch Tiene razón,
printf
es un integrado endash
y no ‘ t reconoce\x
el escape. Puede usar/usr/bin/printf
en lugar deprintf
para que funcione. Normalmente, debería poder utilizarcommand printf
, pero parece que no funciona como debería. Continúa utilizando el sistema integrado. - @Jezz de hecho, el soporte para
\x
El escape no es parte de POSIX: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html Durante mis pruebas vi otro problema. Es posible que desee reemplazar su..
expresión regular por[a-zA-Z0-9][a-zA-Z0-9]
porque de lo contrario ingrese como ‘ %% % ‘ fallará. También agregués/%/%%/g
al final para asegurarme de escapar de los porcentajes para printf.
Respuesta
Otra solución usando ruby (la respuesta de Python aceptada no funcionaba para mí)
alias urldecode="ruby -e "require \"cgi\"; puts CGI.unescape(ARGV[0])"" alias urlencode="ruby -e "require \"cgi\"; puts CGI.escape(ARGV[0])""
Ejemplo
$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B
Comentarios
- Solo solía usar ruby, y estas declaraciones parecen más pequeñas. Además, cambié a ARGF.read para poder integrarlo como lo hago con muchas otras utilidades.
Responder
Aquí hay una función BASH para hacer exactamente eso:
function urldecode() { echo -ne $(echo -n "$1" | sed -E "s/%/\\\\x/g") }
Comentarios
- funciona a la perfección
- Si desea convertir
+
caracteres a espacios y no generar ningún proceso, puede usar esto:: "${1//+/ }" && echo -e "${_//%/\\x}"
Respuesta
Solo shell:
$ x="a%20%25%e3%81%82";printf "${x//\%/\\x}" a %あ
Agregar --
o %b
para evitar que los argumentos que comienzan con un guión se traten como opciones.
En zsh ${x//%/a}
agrega a
al final, pero ${x//\%/a}
reemplaza %
por a
.
Respuesta
Aquí están los bits relevantes de otro script (que simplemente robé de mi youtube.com descargar script de otra respuesta) que he escrito antes. Utiliza sed
y el shell para crear un código de URL que funcione.
set \! \" \# \$ \% \& \" \( \) \* \ \+ \, \/ \: \; \= \? \@ \[ \] for c do set "$@" ""$c" "$c"; shift; done curl -s "$url" | sed "s/\\u0026/\&/g;""$( printf "s/%%%X/\\%s/g;" "$@" )"
No juro que sea completo – y de hecho lo dudo – pero manejó YouTube con bastante seguridad.
Respuesta
La solución simple para cadenas cortas (el shell es lentowww):
$ str="q+werty%3D%2F%3B" $ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n" q werty=/;