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
- stackoverflow.com/questions/6250698/…
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:
- Voi wget purkaa uri tiedostojen nimet ladattaessa erässä?
- Kuinka poistaa URI-koodaus tiedostojen nimistä?
Aiheeseen liittyvät:
- Kuinka puretaan URL-koodattu merkkijono kuoressa? SO li: ssä >
- Kuinka voin koodata ja purkaa prosenttikoodatut merkkijonot komentorivillä? osoitteessa Ask Ubuntu
Kommentit
-
awk
: Koska tämä tekee Kun kirjastofunktiotachr()
käytetään, on todennäköistä, että se toimii vain GNU awk: lla (gawk
). Tällöin POSIXilleawk
ei tuskin ole yhtään vastaavaa, koska-n
-vaihtoehto (sallimalla muut kuin desimaaliarvot) ON GNUawk
-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
A
–Z
a
–z
0
–9
.
_
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-osoitehttp://www.gridpp.ac.uk/
muuttuuhttp%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äänrakennettudash
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ääncommand 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öss/%/%%/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=/;