Afkodning af URL-kodning (procentkodning)

Jeg vil afkode URL-kodning, er der noget indbygget værktøj til at gøre dette, eller kan nogen give mig en sed kode, der vil gøre dette?

Jeg søgte lidt gennem unix.stackexchange.com og på internettet, men jeg kunne ikke finde noget kommandolinjeværktøj til afkodning url-kodning.

Hvad jeg vil gøre er simpelthen på plads, rediger en txt -fil, så:

  • %21 bliver !
  • %23 bliver #
  • %24 bliver $
  • %26 bliver &
  • %27 bliver "
  • %28 bliver (
  • %29 bliver )

Og så videre.

Kommentarer

Svar

Fundet disse Python one liners, der gør hvad du vil:

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]))"" 

Eksempel

$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B 

Referencer

Kommentarer

  • Jeg ved det meget sent , men er der nogen måde, jeg kan gøre dette på med stedredigering?
  • @DisplayName – lyder som en ny Q for mig. Jeg ‘ spørger den og henviser til denne.
  • 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]"
  • Se @DIG mbl ‘ s beblow for et svar, der fungerer med stdin.

Svar

sed

Prøv følgende kommandolinje:

$ sed "s@+@ @g;s@%@\\x@g" file | xargs -0 printf "%b" 

eller følgende alternativ ved hjælp af echo -e:

$ sed -e"s/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g" file | xargs echo -e 

Bemærk: Ovenstående syntaks konverterer muligvis ikke + til mellemrum og kan spise alle de nye linjer.


Du kan definere det som alias og føje det til dine shell rc filer:

$ alias urldecode="sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"" 

Så hver gang du har brug for det, skal du blot gå med:

$ echo "http%3A%2F%2Fwww" | urldecode http://www 

Bash

Under scripting kan du bruge følgende syntaks:

input="http%3A%2F%2Fwww" decoded=$(printf "%b" "${input//%/\\x}") 

Men ovenfor syntaks vandt ikke plusser (+) korrekt, så du skal erstatte dem med mellemrum via sed eller som foreslået af @isaac , brug følgende syntaks:

decoded=$(input=${input//+/ }; printf "${input//%/\\x}") 

Du kan også bruge følgende urlencode() og urldecode() funktioner:

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}" } 

Bemærk, at over urldecode() forudsætter, at dataene ikke indeholder tilbageslag.

Her ligner Joels version fundet på: https://github.com/sixarm/urldecode.sh


bash + xxd

Bash-funktion med xxd værktøj:

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 } 

Fundet i cdowns kernefil , også ved stackoverflow .


PHP

Ved hjælp af PHP kan du prøve følgende kommando:

$ echo oil+and+gas | php -r "echo urldecode(fgets(STDIN));" // Or: php://stdin oil and gas 

eller bare:

php -r "echo urldecode("oil+and+gas");" 

Brug -R til input med flere linjer.


Perl

I Perl dig kan bruge URI::Escape .

decoded_url=$(perl -MURI::Escape -e "print uri_unescape($ARGV[0])" "$encoded_url") 

Eller for at behandle en fil:

perl -i -MURI::Escape -e "print uri_unescape($ARGV[0])" file 

awk

Prøv anon løsning:

awk -niord "{printf RT?$0chr("0x"substr(RT,2)):$0}" RS=%.. 

Bemærk: Parameter -n er specifik for GNU awk.

Se: Brug af awk printf til at urlecode tekst .

afkodningsfilnavne

Hvis du har brug for at fjerne url-kodning fra filnavne, skal du bruge deurlname værktøjet fra renameutils (f.eks deurlname *.*).

Se også:


Relateret:

Kommentarer

  • awk: Da dette gør brug af en biblioteksfunktion, chr(), der er stor sandsynlighed for, at det udelukkende fungerer på GNU awk (gawk). I dette tilfælde vil der dog næppe være nogen ækvivalent for POSIX awk, fordi indstillingen -n (tillader ikke-decimale argumenter) ER en GNU awk specialitet.
  • Dine løsninger, der involverer printf, tager ikke højde for, at webadressen kan indeholde undslippede procenttegn som %25. Du videregiver disse til printf uden at undslippe dem til printf med et andet procenttegn som %%.
  • Bash-versionen kræver local LC_ALL=C øverst, ellers er alle brede tegn (dvs. japansk, kinesisk osv.) ikke opdelt ordentligt i bytes.
  • github.com/SixArm/ urlencode.sh
  • Printf-versionerne fungerer ikke ‘ når du bruger BSD-versionen af printf (f.eks. macOS), men det fungerer fint, når du bruger GNU Coreutils version.

Svar

Der er en indbygget funktion til det i Python-standardbiblioteket. I Python 2 er det “s urllib.unquote .

decoded_url=$(python2 -c "import sys, urllib; print urllib.unquote(sys.argv[1])" "$encoded_url") 

Eller for at behandle en fil:

python2 -c "import sys, urllib; print urllib.unquote(sys.stdin.read())" <file >file.new && mv -f file.new file 

I Python 3 er det “s urllib.parse.unquote .

decoded_url=$(python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" "$encoded_url") 

Eller for at behandle en fil:

python3 -c "import sys, urllib; print(urllib.parse.unquote(sys.stdin.read()))" <file >file.new && mv -f file.new file 

I Perl kan du bruge URI::Escape .

decoded_url=$(perl -MURI::Escape -e "print uri_unescape($ARGV[0])" "$encoded_url") 

Eller for at behandle en fil:

perl -i -MURI::Escape -e "print uri_unescape($ARGV[0])" file 

Hvis du vil holde dig til POSIX bærbare værktøjer, er det ” s akavet, fordi den eneste seriøse kandidat er akavet, hvilket ikke analyserer hexadecimale tal. Se Brug af awk printf til urldekode tekst for eksempler med almindelige awk-implementeringer, herunder BusyBox.

Svar

Perl one liner:

$ perl -pe "s/\%(\w\w)/chr hex $1/ge" 

Eksempel:

$ echo "%21%22" | perl -pe "s/\%(\w\w)/chr hex $1/ge" !" 

Kommentarer

  • Dette svar er attraktivt, når du ikke ‘ ikke vil beskæftige sig med installation af perl-moduler.
  • Kun en, der fungerede elegant for mig på MacOS.
  • Hvis du vil løse alle niveauerne af URL-kodning på én gang, er der ‘ s også perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);' som afkoder alle %25xx indlejrede kodninger

Svar

Hvis du vil bruge en enkel sed -kommando, skal du bruge følgende:

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" 

Men det er mere praktisk at oprette et script som (sig sedscript):

 s/%21/!/g s/%23/#/g s/%24/$/g s/%26/\&/g s/%27/"/g s/%28/(/g s/%29/)/g  

Kør derefter sed -f sedscript < old > new, som vil output som du ønsker.


For en lethed er kommandoen urlencode også tilgængelig direkte i gridsite-clients -pakken kan installeres fra (af sudo apt-get install gridsite-clients i Ubuntu / Debian-systemet).

NAVN

    urlencode – konverter strenge til eller fra URL-kodet form

SYNOPSIS

    urlencode [-m|-d] string [string ...]

BESKRIVELSE

    urlencode koder for strenge i henhold til RFC 1738.

    Det vil sige tegn AZ az 09 . _ og - sendes gennem umodificeret, men alle andre tegn er repræsenteret som% HH, hvor HH er deres to-d igit store bogstaver hexadecimal ASCII-repræsentation. URL-adressen http://www.gridpp.ac.uk/ bliver f.eks. http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencode konverterer hvert tegn i alle strengene angivet på kommandolinjen. Hvis der er angivet flere strenge, sammenkædes de med adskilte mellemrum inden konvertering.

VALGMULIGHEDER

    -m

      I stedet for fuld konvertering skal du gøre GridSite “mild URL-kodning” hvor AZ az 0-9. = – _ @ og / sendes gennem umodificeret. Dette resulterer i lidt mere menneskeligt læsbare strenge, men applikationen skal være forberedt på at oprette eller simulere de mapper, der er underforstået med eventuelle skråstreger.

    -d

      Gør URL-afkodning snarere end kodning ifølge RFC 1738.% HH og% hh strenge konverteres, og andre tegn sendes gennem umodificeret, med den undtagelse at + konverteres til mellemrum.

Eksempel på afkodning af URL:

$ urlencode -d "http%3a%2f%2funix.stackexchange.com%2f" http://unix.stackexchange.com/ $ urlencode -d "Example: %21, %22, . . . , %29 etc" Example: !, ", . . . , ) etc 

Kommentarer

  • For tutorial på sed besøg
  • Dette er en dårlig løsning, fordi det kræver hårdkodning af hvert tegn. Dette problem er eksemplificeret ved, at din kode mangler den ofte anvendte %20 escape-sekvens.
  • @Overv I ‘ har bare Revideret
  • Det kan også være en god idé at dobbelttjekke, hvad s/%26/&/g gør. (Jeg fik det.)

Svar

Jeg kan ikke kommentere bedste svar i denne tråd , så her er mit.

Personligt bruger jeg disse aliaser til URL-kodning og afkodning:

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])"" 

Begge kommandoer giver dig mulighed for at konvertere data, sendt som et kommandolinjeargument eller læse det fra standardindgang , fordi begge enlinjer kontrollerer, om der er kommandolinjeargumenter (selv tomme) og behandler dem eller bare læser standardindgang ellers.


opdatering 05-05-2017 (skråstregkodning)

Som svar på @Bevors kommentar.

Hvis du skal også kode skråstreg, bare tilføj et tomt andet argument til citatfunktionen, så skråstreg vil også blive kodet.

Så endelig urlencode alias i bash ser sådan ud:

alias urlencode="python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")"" 

Eksamen 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 

Kommentarer

  • Koder ikke skråstreg.
  • @Bevor : Eksempel?
  • Føj en skråstreg til urlencode ” Проба пера ” – > resultat: skråstreg er ikke kodet.
  • @Bevor: Du har ret. Tak for din kommentar. Jeg vil også ændre mit svar for at afspejle din kommentar i det.

Svar

GNU Awk

#!/usr/bin/awk -fn @include "ord" BEGIN { RS = "%.." } { printf "%s", $0 if (RT != "") { printf "%s", chr("0x" substr(RT, 2)) } } 

Svar

Og en anden Perl-tilgang:

 #!/usr/bin/env perl use URI::Encode; my $uri = URI::Encode->new( { encode_reserved => 0 } ); while (<>) { print $uri->decode($_) }  

Du skal installere URI::Encode -modulet. På min Debian kunne jeg simpelthen køre

sudo apt-get install liburi-encode-perl 

Derefter kørte jeg scriptet ovenfor på en testfil indeholdende:

 http://foo%21asd%23asd%24%26asd%27asd%28asd%29  

Resultatet blev (jeg havde gemt scriptet som foo.pl):

 $ ./foo.pl http://foo!asd#asd$&asd"asd(asd)  

Svar

Et svar i (for det meste Posix) skal:

$ input="%21%22" $ printf "`printf "%s\n" "$input" | sed -e "s/+/ /g" -e "s/%\(..\)/\\\\x\1/g"`" !" 

Forklaring:

  • -e "s/+/ /g transformerer hver + i rummet (som beskrevet i url-kodningsnorm)
  • -e "s/%\(..\)/\\\\x\1/g" transformer hver %XX i \\xXX. Bemærk, at en af \ fjernes ved at citere regler.
  • Den indre printf er lige der for at sende input til sed. Vi kan erstatte den med enhver anden mekanisme
  • Den ydre printf fortolker \\xXX sekvenser og viser resultatet.

Rediger:

Da % altid skal fortolkes i webadresser, det er muligt at forenkle dette svar. Derudover synes jeg det er renere at bruge xargs i stedet for backquotes (takket være @josch).

$ input="%21%22+%25" $ printf "%s\n" "$input" | sed -e "s/+/ /g; s/%/\\x/g" | xargs -0 printf !" % 

Desværre (som @josch bemærkede) er ingen af disse løsninger Posix-kompatible, da \x escape-sekvens ikke er defineret i Posix.

Kommentarer

  • Velkommen til U & L. Måske kan du forklare dette svar, og hvordan det fungerer. Vi foretrækker generelt, at vores svar er lang form med detaljer, ikke kun kodestykker.
  • Jeg kan virkelig godt lide dette svar, fordi det ‘ er omfattende, bærbart og ikke ‘ t kræver ekstra tungere eksterne programmer som perl eller python. Fungerer godt for mig.
  • Fantastisk løsning. Og endnu kortere og smartere: ... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'. Valget -e kan faktisk udelades her …
  • @josch Du har ret, printf er en indbygget i dash og det ‘ t genkender \x undslipper. Du kan bruge /usr/bin/printf i stedet for printf for at få det til at fungere. Normalt skal du kunne bruge command printf, men det ser ud til at det ikke fungerer som det skal. Det fortsætter med at bruge indbygget.
  • @Jezz faktisk understøtter \x undslippe er ikke en del af POSIX: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html Under mine tests så jeg et andet problem. Du vil måske erstatte din .. regex med [a-zA-Z0-9][a-zA-Z0-9] fordi ellers indtastes som ‘ %% % ‘ mislykkes. Jeg tilføjede også s/%/%%/g i slutningen for at sikre, at jeg undgår procentdele for printf.

Svar

En anden løsning ved hjælp af rubin (accepteret pythonsvar fungerede ikke for mig)

 alias urldecode="ruby -e "require \"cgi\"; puts CGI.unescape(ARGV[0])"" alias urlencode="ruby -e "require \"cgi\"; puts CGI.escape(ARGV[0])""  

Eksempel

 $ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B  

Kommentarer

  • Brugte bare rubin, og disse udsagn ser mindre ud. Også, jeg skiftede til ARGF.read, så jeg kan pibe det ind som jeg gør med mange andre hjælpeprogrammer!

Svar

Her er en BASH-funktion til at gøre netop det:

function urldecode() { echo -ne $(echo -n "$1" | sed -E "s/%/\\\\x/g") } 

Kommentarer

  • fungerer som charme
  • Hvis du vil konvertere + tegn til mellemrum og ikke gyde nogen processer, kan du bruge dette: : "${1//+/ }" && echo -e "${_//%/\\x}"

Svar

Kun shell:

 $ x="a%20%25%e3%81%82";printf "${x//\%/\\x}" a %あ  

Tilføj -- eller %b for at forhindre, at argumenter, der starter med en bindestreg, behandles som optioner.

I zsh ${x//%/a} tilføjer a til slutningen, men ${x//\%/a} erstatter % med a.

Svar

Her er de relevante bits fra et andet script (som jeg bare skamløst stjal fra mit youtube.com download script fra et andet svar) Jeg har skrevet før. Det bruger sed og skallen til at opbygge en fungerende urldecode.

set \! \" \# \$ \% \& \" \( \) \* \ \+ \, \/ \: \; \= \? \@ \[ \] for c do set "$@" ""$c" "$c"; shift; done curl -s "$url" | sed "s/\\u0026/\&/g;""$( printf "s/%%%X/\\%s/g;" "$@" )" 

Jeg sværger ikke, det er omfattende – og faktisk tvivler jeg på det – men det håndterede youtube sikkert nok.

Svar

Den enkle løsning til kort strenge (shell er langsomwww):

$ str="q+werty%3D%2F%3B" $ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n" q werty=/; 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *