Koding av URL-koding (prosentkoding)

Jeg vil dekode URL-koding, er det noe innebygd verktøy for å gjøre dette, eller kan noen gi meg en sed kode som vil gjøre dette?

Jeg søkte litt gjennom unix.stackexchange.com og på internett, men jeg kunne ikke finne noe kommandolinjeverktøy for avkoding url-koding.

Det jeg ønsker å gjøre er å redigere en txt -fil slik at den:

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

Og så videre.

Kommentarer

Svar

Fant disse Python one-linjene som gjør det 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 

Referanser

Kommentarer

  • Jeg vet dette veldig sent , men er det noen måte jeg kan gjøre dette med redigering på plass?
  • @DisplayName – høres ut som en ny Q for meg. Jeg spør ‘ og refererer 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 svarblåsing for en som 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 hjelp av echo -e:

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

Merk: Syntaksen ovenfor kan ikke konvertere + til mellomrom, og kan spise alle de nye linjene.


Du kan definere det som alias og legge det til skallet ditt rc filer:

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

Så hver gang du trenger det, kan du bare gå med:

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

Bash

Ved skripting kan du bruke følgende syntaks:

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

Men ovenfor syntaks vant ikke pluss (+) riktig, så du må erstatte dem med mellomrom via sed eller som foreslått av @isaac , bruk følgende syntaks:

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

Du kan også bruke følgende urlencode() og urldecode() funksjoner:

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

Merk at over urldecode() forutsetter at dataene ikke inneholder tilbakeslag.

Her er en lignende Joel-versjon funnet på: https://github.com/sixarm/urldecode.sh


bash + xxd

Bash-funksjon med xxd verktøy:

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 } 

Funnet i cdowns gist-fil , også i stackoverflow .


PHP

Ved hjelp av 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");" 

Bruk -R for flere linjeinnganger.


Perl

I Perl deg kan bruke URI::Escape .

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

Eller for å 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=%.. 

Merk: Parameter -n er spesifikk for GNU awk.

Se: Bruke awk printf for å urkode tekst .

dekoding av filnavn

Hvis du trenger å fjerne url-koding fra filnavnene, bruker du deurlname verktøy fra renameutils (f.eks deurlname *.*).

Se også:


Relatert:

Kommentarer

  • awk: Da dette gjør bruk av en biblioteksfunksjon, chr(), er det stor sannsynlighet for at det kun vil fungere på GNU awk (gawk). I dette tilfellet vil det imidlertid knapt være noe tilsvarende for POSIX awk, fordi alternativet -n (tillater ikke-desimale argumenter) ER en GNU awk spesialitet.
  • Dine løsninger som involverer printf tar ikke hensyn til at url kan inneholde rømte prosenttegn som %25. Du sender disse til printf uten å unnslippe dem for printf med et annet prosenttegn som %%.
  • Bash-versjonen krever local LC_ALL=C øverst, ellers er ikke alle brede tegn (dvs. japansk, kinesisk osv.) brutt opp i byte.
  • github.com/SixArm/ urlencode.sh
  • Printf-versjonene fungerer ikke ‘ t når du bruker BSD-versjonen av printf (f.eks. macOS), men det fungerer bra når du bruker GNU Coreutils-versjon.

Svar

Det er en innebygd funksjon for 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 å 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 den «s urllib.parse.unquote .

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

Eller for å 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 bruke URI::Escape .

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

Eller for å behandle en fil:

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

Hvis du vil holde deg til POSIX bærbare verktøy, er det » s klosset, fordi den eneste seriøse kandidaten er kloss, som ikke analyserer heksadesimale tall. Se Bruke awk printf til å urkode tekst for eksempler med vanlige awk-implementeringer, inkludert 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 svaret er attraktivt når du ikke ‘ ikke vil håndtere installering av perl-moduler.
  • Bare en som fungerte elegant for meg på MacOS.
  • Hvis du vil løse alle nivåene av URL-koding på en gang, er det ‘ s også perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);' som vil dekode alle %25xx nestede kodinger

Svar

Hvis du vil bruke en enkeltsinnet sed -kommando, så bruk 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 mer praktisk å lage et skript som (si sedscript):

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

Kjør deretter sed -f sedscript < old > new, som vil sende ut som du ønsker.


For enkelhets skyld er kommandoen urlencode også tilgjengelig direkte i gridsite-clients -pakken kan installeres fra (av sudo apt-get install gridsite-clients i Ubuntu / Debian-systemet).

NAME

    urlencode – konverter strenger til eller fra URL-kodet form

SYNOPSIS

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

BESKRIVELSE

    urlencode koder for strenger i henhold til RFC 1738.

    Det vil si tegn AZ az 09 . _ og - sendes gjennom umodifiserte, men alle andre tegn er representert som% HH, hvor HH er deres to-d igit heksadesimal ASCII-representasjon i store bokstaver. URL-adressen http://www.gridpp.ac.uk/ blir for eksempel http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencode hvert tegn i alle strengene gitt på kommandolinjen. Hvis det er gitt flere strenger, blir de sammenkoblet med mellomrom før konvertering.

ALTERNATIV

    -m

      I stedet for full konvertering, gjør GridSite «mild URL-koding» der AZ az 0-9. = – _ @ og / sendes gjennom umodifisert. Dette resulterer i litt mer menneskelesbare strenger, men applikasjonen må være forberedt på å opprette eller simulere katalogene som er underlagt eventuelle skråstreker.

    -d

      Gjør URL-dekoding heller enn koding, ifølge RFC 1738.% HH og% hh strenger konverteres og andre tegn sendes umodifiserte, med unntak av at + konverteres til mellomrom.

Eksempel på dekoding av 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 veiledning om sed besøk
  • Dette er en dårlig løsning, fordi det krever hardkoding av hvert tegn. Dette problemet er eksemplifisert ved at koden din mangler den ofte brukte %20 escape-sekvensen.
  • @Overv I ‘ har bare Revidert
  • Det kan også være lurt å dobbeltsjekke hva s/%26/&/g gjør. (Jeg fikset det.)

Svar

Jeg kan ikke kommentere beste svaret i denne tråden , så her er mitt.

Personlig bruker jeg disse aliasene for URL-koding og dekoding:

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 kommandoene lar deg konvertere data, sendt som et kommandolinjeargument eller lese det fra standardinngang , fordi begge enlinjene sjekker om det er kommandolinjeargumenter (til og med tomme) og behandler dem eller bare leser standardinngang ellers.


oppdater 23.05.2017 (skråstrekskoding)

Som svar på @Bevors kommentar.

Hvis du trenger også å kutte skråstrek, bare legg til et tomt andre argument i sitatfunksjonen, så blir skråstrek også kodet.

Så til slutt urlencode alias i bash ser slik ut:

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åstreker.
  • @Bevor : Eksempel?
  • Legg til en skråstrek i urlerkoden » Проба пера » – > resultat: Skråstrek er ikke kodet.
  • @Bevor: Du har rett. Takk for kommentaren din. Jeg vil også endre svaret mitt for å gjenspeile kommentaren din 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 annen Perl-tilnærming:

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

Du må installere URI::Encode -modulen. På Debian kunne jeg bare kjøre

sudo apt-get install liburi-encode-perl 

Så kjørte jeg skriptet ovenfor på en testfil som inneholder:

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

Resultatet ble (jeg hadde lagret skriptet som foo.pl):

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

Svar

Et svar i (for det meste Posix) skall:

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

Forklaring:

  • -e "s/+/ /g transformerer hver + i rommet (som beskrevet i url-kodingsnorm)
  • -e "s/%\(..\)/\\\\x\1/g" transformer hver %XX i \\xXX. Legg merke til at en av \ vil bli fjernet ved å sitere regler.
  • Den indre printf er bare der for å overføre input til sed. Vi kan erstatte den med en hvilken som helst annen mekanisme
  • Den ytre printf tolker \\xXX sekvenser og viser resultatet.

Rediger:

Siden % alltid skal tolkes i nettadresser, det er mulig å forenkle dette svaret. I tillegg synes jeg det er renere å bruke xargs i stedet for backquotes (takk til @josch).

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

Dessverre (som @josch la merke til), er ingen av disse løsningene Posix-kompatible siden \x escape-sekvensen ikke er definert i Posix.

Kommentarer

  • Velkommen til U & L. Kanskje du kan forklare dette svaret og hvordan det fungerer. Vi foretrekker generelt at svarene våre er langformede med detaljer, ikke bare kodebiter.
  • Jeg liker virkelig dette svaret fordi det ‘ er omfattende, bærbart og ikke ‘ t krever ekstra tyngre eksterne programmer som perl eller python. Fungerer bra for meg.
  • Flott løsning. Og enda kortere og smartere: ... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'. -e alternativet kan faktisk utelates her …
  • @josch Du har rett, printf er en innebygd i dash og det ‘ t gjenkjenner \x unnslippe. Du kan bruke /usr/bin/printf i stedet for printf for å få det til å fungere. Normalt bør du kunne bruke command printf, men det ser ut til at det ikke fungerer som det skal. Den fortsetter å bruke innebygd.
  • @Jezz faktisk støtte for \x rømning er ikke en del av POSIX: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html Under testene mine så jeg et annet problem. Det kan være lurt å erstatte .. regex med [a-zA-Z0-9][a-zA-Z0-9] fordi du ellers skriver inn som ‘ %% % ‘ mislykkes. Jeg la også til s/%/%%/g på slutten for å sørge for å unnslippe prosenter for printf.

Svar

En annen løsning ved bruk av rubin (akseptert pythonsvar fungerte ikke for meg)

 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

  • Bare brukt til å rubinere, og disse utsagnene ser mindre ut. Også, jeg endret til ARGF.read slik at jeg kan pipe den inn som jeg gjør med mange andre verktøy!

Svar

Her er en BASH-funksjon for å gjøre akkurat det:

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

Kommentarer

  • fungerer som sjarm
  • Hvis du vil konvertere + tegn til mellomrom og ikke gyte noen prosesser, kan du bruke dette: : "${1//+/ }" && echo -e "${_//%/\\x}"

Svar

Bare shell:

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

Legg til -- eller %b for å forhindre at argumenter som starter med en bindestrek blir behandlet som alternativer.

I zsh ${x//%/a} legger til a til slutten, men ${x//\%/a} erstatter % med a.

Svar

Her er de relevante bitene fra et annet skript (som jeg bare skamløst stjal fra nedlastingsskriptet til youtube.com fra et annet svar) Jeg har skrevet før. Den bruker sed og skallet til å bygge opp en fungerende urldekode.

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

Jeg vil ikke sverge at den er omfattende – og faktisk tviler jeg på det – men det taklet youtube sikkert nok.

Svar

Den enkle løsningen for kort strenger (skallet er tregtwww):

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *