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:
- Hvordan afkodes URL-kodet streng i shell? ved SO
- Hvordan kan jeg kode og afkode procentkodede strenge på kommandolinjen? hos Ask Ubuntu
Kommentarer
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
A
–Z
a
–z
0
–9
.
_
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-adressenhttp://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 idash
og det ‘ t genkender\x
undslipper. Du kan bruge/usr/bin/printf
i stedet forprintf
for at få det til at fungere. Normalt skal du kunne brugecommand 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=/;
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 POSIXawk
, fordi indstillingen-n
(tillader ikke-decimale argumenter) ER en GNUawk
specialitet.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%%
.local LC_ALL=C
øverst, ellers er alle brede tegn (dvs. japansk, kinesisk osv.) ikke opdelt ordentligt i bytes.