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
- stackoverflow.com/questions/6250698/…
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:
- Hvordan avkode URL-kodet streng i skall? på SO
- Hvordan kan jeg kode og dekode prosentkodede strenger på kommandolinjen? på Ask Ubuntu
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 POSIXawk
, fordi alternativet-n
(tillater ikke-desimale argumenter) ER en GNUawk
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
A
–Z
a
–z
0
–9
.
_
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-adressenhttp://www.gridpp.ac.uk/
blir for eksempelhttp%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 idash
og det ‘ t gjenkjenner\x
unnslippe. Du kan bruke/usr/bin/printf
i stedet forprintf
for å få det til å fungere. Normalt bør du kunne brukecommand 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å tils/%/%%/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=/;