Dekoodaa URL-koodaus (koodausprosentti)

Haluan purkaa URL-koodauksen, onko tähän mitään sisäänrakennettua työkalua tai voisiko joku antaa minulle sed koodi, joka tekee tämän?

Etsin hiukan unix.stackexchange.com -palvelun kautta ja Internetistä, mutta en löytänyt mitään komentorivityökalua dekoodaamiseen URL-koodaus.

Haluan tehdä yksinkertaisesti muokkaamalla txt -tiedostoa seuraavasti:

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

Ja niin edelleen.

Kommentit

Vastaa

Löysit nämä Python one -vuorot, jotka tekevät mitä haluat:

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

Esimerkki

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

Viitteet

Kommentit

  • Tiedän tämän hyvin myöhään , mutta voinko mitenkään tehdä tämän muokkaamalla paikallisesti?
  • @DisplayName – kuulostaa uudelta Q: lta. ’ kysyin ja viittaan tähän.
  • suoratoisto: cat your_lovely_file.csv| python -c "import sys, urllib as ul; [sys.stdout.write(ul.quote_plus(l)) for l in sys.stdin]"
  • Katso @DIG mbl ’ vastauksen beblow sellaiselle, joka toimii stdinin kanssa.

Vastaa

sed

Kokeile seuraavaa komentoriviä:

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

tai seuraava vaihtoehto käyttämällä echo -e:

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

Huomaa: Yllä oleva syntaksi ei välttämättä muunna + välilyönteihin ja voi syödä kaikki uudet rivit.


Voit määrittää sen aliakseksi ja lisätä sen shell- rc -tiedostoihisi:

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

Mene sitten aina, kun tarvitset sitä:

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

Bash

Komentosarjoja käytettäessä voit käyttää seuraavaa syntaksia:

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

Yllä oleva syntakse ei kuitenkaan käsittele plussia (+) oikein, joten korvaa ne välilyönneillä sed tai @isaac ehdotuksen mukaisesti käytä seuraavaa syntaksia:

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

Voit käyttää myös seuraavia toimintoja urlencode() ja 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}" } 

Huomaa, että yllä urldecode() oletetaan, että tiedot eivät sisällä taaksepäin vinoviivaa.

Tässä on samanlainen Joelin versio, joka löytyy osoitteesta: https://github.com/sixarm/urldecode.sh


bash + xxd

Bash-toiminto xxd -työkalulla:

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 } 

Löydetty cdown ”-tietotiedostossa , myös osoitteessa pinoverflow .


PHP

PHP: n avulla voit kokeilla seuraavaa komentoa:

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

tai vain:

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

Käytä -R useiden rivien syöttöön.


Perl

Perlissä sinä voi käyttää URI::Escape .

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

Tai käsitellä tiedostoa:

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

awk

Kokeile anon ratkaisu:

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

Huomaa: Parametri -n on ominainen GNU: lle awk.

Katso: awk printf: n käyttäminen tekstin dekoodaamiseen .

tiedostojen nimien dekoodaus

Jos sinun on poistettava URL-koodaus tiedostojen nimistä, käytä deurlname -työkalua osoitteesta renameutils (esim deurlname *.*).

Katso myös:


Aiheeseen liittyvät:

Kommentit

  • awk: Koska tämä tekee Kun kirjastofunktiota chr() käytetään, on todennäköistä, että se toimii vain GNU awk: lla (gawk). Tällöin POSIXille awk ei tuskin ole yhtään vastaavaa, koska -n -vaihtoehto (sallimalla muut kuin desimaaliarvot) ON GNU awk -erikoisuus.
  • Ratkaisuissasi, joihin liittyy printf, ei oteta huomioon URL-osoite saattaa sisältää pakollisia prosenttimerkkejä, kuten %25. Voit siirtää nämä printf: lle välttämättä niitä printf: lle toisella prosenttimerkillä, kuten %%.
  • Bash-versio vaatii local LC_ALL=C yläosassa, muuten kaikkia leveitä merkkejä (esim. japanilaisia, kiinalaisia jne.) ei ole jaettu oikein tavuihin.
  • github.com/SixArm/ urlencode.sh
  • printf-versiot eivät toimi ’ eivät toimi, kun käytetään printf: n BSD-versiota (esim. macOS), mutta se toimii hyvin, kun GNU Coreutils -versio.

Answer

Tätä varten on sisäänrakennettu toiminto Python-standardikirjastossa. Python 2: ssa se ”s urllib.unquote .

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

Tai tiedoston käsittely:

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

Python 3: ssa se ”s urllib.parse.unquote .

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

Tai käsitellä tiedostoa:

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

Perlissä voit käyttää URI::Escape .

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

Tai tiedoston käsittely:

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

Jos haluat pitää kiinni kannettavista POSIX-työkaluista, se ” s hankala, koska ainoa vakava ehdokas on awk, joka ei jäsennä heksadesimaalilukuja. Katso awk printf -toiminnon käyttäminen tekstin dekoodaamiseen esimerkkejä yleisistä awk-toteutuksista, mukaan lukien BusyBox.

Vastaa

Perl yksi linja:

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

Esimerkki:

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

Kommentit

  • Tämä vastaus on houkutteleva, kun et halua ’ et halua käsitellä perl-moduulien asentamista.
  • Vain yksi, joka toimi minulle tyylikkäästi MacOS-käyttöjärjestelmässä.
  • Jos haluat ratkaista kaikki URL-koodauksen tasot kerralla, ’ s perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);', joka purkaa kaikki %25xx sisäkkäiset koodaukset

vastaus

Jos haluat käyttää yksinkertaista sed -komentoa, käytä seuraavaa:

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" 

Mutta on helpompaa luoda komentosarja, kuten (sano sedscript):

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

Suorita sitten sed -f sedscript < old > new, joka tulostaa haluamallasi tavalla.


Helppokäyttöisyyden vuoksi komento urlencode on saatavana myös suoraan kohdassa gridsite-clients -paketti voidaan asentaa osoitteesta (sudo apt-get install gridsite-clients Ubuntu / Debian-järjestelmässä).

NIMI

    urlencode – muunna merkkijonot URL-koodattuun muotoon tai siitä

SYNOPSIS

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

KUVAUS

    urlencode koodaa merkkijonot RFC 1738: n mukaisesti.

    Eli merkit AZ az 09 . _ ja - siirretään muokkaamattomana mutta kaikki muut merkit esitetään% HH: na, missä HH on heidän kahden d: nsä igit isojen kirjainten heksadesimaalinen ASCII-esitys. Esimerkiksi URL-osoite http://www.gridpp.ac.uk/ muuttuu http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencode muuntaa kukin merkki kaikista komentorivillä annetuista merkkijonoista. Jos annetaan useita merkkijonoja, ne ketjutetaan erillisillä välilyönneillä ennen muuntamista.

VAIHTOEHDOT

    -m

      Täyden muunnoksen sijaan tee GridSite ”lievä URL-koodaus”. jossa AZ az 0-9. = – _ @ ja / ja siirretään muokkaamattomana. Tämä johtaa hieman ihmisen luettavampiin merkkijonoihin, mutta sovelluksen on oltava valmis luomaan tai simuloimaan kauttaviivojen merkitsemät hakemistot.

    -d

      Tee URL-dekoodaus pikemminkin kuin koodaus, RFC 1738: n mukaan% HH- ja% hh-merkkijonot muunnetaan ja muut merkit välitetään muokkaamattomina, paitsi että + muunnetaan avaruudeksi.

Esimerkki URL-koodin purkamisesta:

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

Kommentit

  • Opas sed -sivulle
  • Tämä on huono ratkaisu, koska se vaatii jokaisen merkin kovakoodaamisen. Tämä ongelma on esimerkki siitä, että koodistasi puuttuu usein käytetty %20 -pakosarja.
  • @Overv I ’ ve just Päivitetty
  • Voit myös tarkistaa uudelleen s/%26/&/g -toiminnon. (Korjasin sen.)

Vastaa

En voi kommentoida kohdetta paras vastaus tässä säikeessä , joten tässä on minun.

Henkilökohtaisesti käytän näitä aliaksia URL-koodaukseen ja dekoodaukseen:

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

Molempien komentojen avulla voit muuntaa tietoja, jotka välitetään -komentoriviargumenttina tai luetaan niistä vakiosyöttö , koska molemmat yksiriviset tarkistavat onko komentoriviargumentteja (jopa tyhjiä) ja käsittelevät ne tai lukevat vain vakiosyöttö muuten.


päivitys 23.5.2015 (kauttakoodaus)

Vastauksena @Bevorin kommenttiin.

Jos täytyy myös koodata kauttaviiva, lisää vain tyhjä toinen argumentti lainausfunktioon, niin myös kauttaviiva koodataan.

Joten lopuksi urlencode alias bash : ssa näyttää tältä:

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

Tentti 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 

Kommentit

  • Ei koodaa kauttaviivoja.
  • @Bevor : Esimerkki?
  • Lisää kauttaviiva URL-koodiin ” Проба пера ” – > tulos: Viiva ei ole koodattu.
  • @Bevor: Olet oikeassa. Kiitos kommentistasi. Muutan myös vastaukseni vastaamaan kommenttisi siinä.

Vastaa

GNU Awk

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

Vastaus

Ja toinen Perl-lähestymistapa:

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

Sinun on asennettava moduuli URI::Encode. Debianilla voisin yksinkertaisesti ajaa

sudo apt-get install liburi-encode-perl 

Sitten suoritin yllä olevan komentosarjan testitiedostossa, joka sisältää:

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

Tulos oli (olin tallentanut komentosarjan nimellä foo.pl):

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

vastaus

Vastaus (enimmäkseen Posix) -kuoressa:

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

Selitys:

  • -e "s/+/ /g muuntaa kukin + avaruudessa (kuten kuvataan URL-koodausnormissa)
  • -e "s/%\(..\)/\\\\x\1/g" muunna kukin %XX ryhmässä \\xXX. Huomaa, että yksi kohdasta \ poistetaan lainaamalla sääntöjä.
  • Sisäinen tuloste on juuri siellä, että se siirtää syötteen sedille. Voimme korvata sen millä tahansa muulla mekanismilla.
  • Ulkoinen tuloste tulkitsee \\xXX -sekvenssejä ja näyttää tuloksen.

Muokkaa:

Koska % tulisi aina tulkita URL-osoitteissa, tätä vastausta on mahdollista yksinkertaistaa. Lisäksi olen sitä mieltä, että on puhtaampaa käyttää xargs backote iden sijaan (kiitos @josch).

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

Valitettavasti (kuten @josch huomasi) mikään näistä ratkaisuista ei ole Posix-yhteensopiva, koska \x -pakosarjaa ei ole määritelty Posixissa.

Kommentit

  • Tervetuloa U & L. Ehkä voisit selittää tämän vastauksen ja miten se toimii. Suosimme yleensä, että vastauksemme ovat pitkiä, yksityiskohtia sisältäviä, ei vain koodinpätkiä.
  • Pidän tästä vastauksesta todella, koska se ’ on kattava, kannettava ja ei ’ t vaatii erityisen painavia ulkoisia ohjelmia, kuten perl tai python. Toimii hyvin minulle.
  • Loistava ratkaisu. Ja vielä lyhyempi ja älykkäämpi: ... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'. Vaihtoehto -e voidaan jättää pois itse asiassa.
  • @josch Olet oikeassa, printf on sisäänrakennettu dash ja se ei tunnista ’ ei tunnista \x pakenemista. Voit käyttää /usr/bin/printf printf -toiminnon sijasta, jotta se toimisi. Normaalisti sinun pitäisi pystyä käyttämään command printf, mutta se ei näytä toimivan niin kuin pitäisi. Se käyttää edelleen sisäänrakennettua.
  • @Jezz todellakin \x -tuen tuki ei ole osa POSIXia: pubit.opperiryhmä.org / onlinepubs / 9699919799 / utilities / printf.html Testien aikana näin toisen ongelman. Haluat ehkä korvata .. regexin [a-zA-Z0-9][a-zA-Z0-9], koska muuten syötät kuten ’ %% % ’ epäonnistuu. Lisäsin lopuksi myös s/%/%%/g varmistaaksesi, että tulosten prosenttiosuudet vältetään.

Vastaa

Toinen rubiinia käyttävä ratkaisu (hyväksytty python-vastaus ei toiminut minulle)

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

Esimerkki

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

kommentit

  • Tottunut vain rubiiniin, ja nämä lausunnot näyttävät pienemmiltä. Vaihdoin myös ARGF.lukemaan, jotta voin liittää sen samaan tapaan kuin monien muiden apuohjelmien kanssa!

Vastaus

Tässä on BASH-toiminto, joka tekee juuri tämän:

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

kommentit

  • toimii kuin viehätys
  • Jos haluat muuntaa + merkit välilyöntejä etkä synny mitään prosesseja, voit käyttää tätä: : "${1//+/ }" && echo -e "${_//%/\\x}"

Vastaa

Vain kuori:

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

Lisää -- tai %b estää viivalla alkavia argumentteja käsittelemästä vaihtoehdoina.

Zsh: ssä ${x//%/a} lisää a loppuun, mutta ${x//\%/a} korvaa % sanoilla a.

vastaus

Tässä ovat toisen skriptin asiaankuuluvat bitit (joita minä vain häpeämättömästi varastin youtube.com -latauskoodiltani toisesta vastauksesta) Olen kirjoittanut aiemmin. Se käyttää sed ja komentotulkkia rakentamaan toimivan URL-koodin.

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

En vannoa sitä ”kattava – ja itse asiassa epäilen sitä – mutta se hoiti youtubea varmasti tarpeeksi.

Vastaus

Yksinkertainen ratkaisu lyhyet merkkijonot (kuori on hidaswww):

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *