Szeretném dekódolni az URL-kódolást, van-e valamilyen beépített eszköz erre, vagy bárki megadhatna nekem egy sed
kód, amely ezt meg fogja tenni?
Kicsit kerestem a unix.stackexchange.com oldalon és az interneten, de a dekódoláshoz nem találtam parancssori eszközt url kódolás.
Amit meg akarok csinálni, egyszerűen helyben szerkesszen egy txt
fájlt úgy, hogy:
-
%21
lesz!
-
%23
#
-
%24
$
- lesz
&
-
%27
"
-
%28
lesz(
-
%29
)
És így tovább.
Megjegyzések
- stackoverflow.com/questions/6250698/…
Válasz
Megtalálta ezeket a Python one vonalakat, amelyek azt csinálnak, amit akar:
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]))""
Példa
$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B
Referenciák
Megjegyzések
- Ezt nagyon későn tudom , de van-e valamilyen módja ennek a helyben történő szerkesztéssel?
- @DisplayName – nekem új Q-nak tűnik. ‘ kérdeztem, és hivatkoztam erre.
- 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]"
- Lásd: @DIG mbl ‘ válasz beblow egy olyan számára, amely működik a stdin-del.
Válasz
sed
Próbálja ki a következő parancssort:
$ sed "s@+@ @g;s@%@\\x@g" file | xargs -0 printf "%b"
vagy a következő alternatívát a :
$ sed -e"s/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g" file | xargs echo -e
Megjegyzés: Előfordulhat, hogy a fenti szintaxis nem konvertál +
szóközökhöz, és meg tudja enni az összes új sort.
Megadhatja álnévként, és hozzáadhatja a shell rc fájlokhoz:
$ alias urldecode="sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b""
Ezután minden alkalommal, amikor szüksége van rá, egyszerűen menjen a következővel:
$ echo "http%3A%2F%2Fwww" | urldecode http://www
Bash
Szkripteléskor a következő szintaxist használhatja:
input="http%3A%2F%2Fwww" decoded=$(printf "%b" "${input//%/\\x}")
A fenti szintaxis azonban nem kezeli a pluszokat (+
) helyesen, tehát szóközökkel kell helyettesíteni őket a vagy a @isaac javaslatának megfelelően használja a következő szintaxist:
decoded=$(input=${input//+/ }; printf "${input//%/\\x}")
Használhatja a következő urlencode()
és urldecode()
funkciókat is:
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}" }
Ne feledje, hogy a fenti
urldecode()
feltételezi, hogy az adatok nem tartalmaznak visszavonást.
Itt található hasonló Joel verzió: https://github.com/sixarm/urldecode.sh
bash + xxd
Bash funkció a xxd
eszközzel:
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 }
Megtalálható a cdown “lényegi fájljában , a stackoverflow fájlban is.
PHP
A PHP használatával kipróbálhatja a következő parancsot:
$ echo oil+and+gas | php -r "echo urldecode(fgets(STDIN));" // Or: php://stdin oil and gas
vagy csak:
php -r "echo urldecode("oil+and+gas");"
Használja a -R
parancsot többsoros bevitelhez.
Perl
Perlben te használhatja a URI::Escape
szót.
decoded_url=$(perl -MURI::Escape -e "print uri_unescape($ARGV[0])" "$encoded_url")
Vagy fájl feldolgozásához:
perl -i -MURI::Escape -e "print uri_unescape($ARGV[0])" file
awk
Próbálja ki anon megoldás:
awk -niord "{printf RT?$0chr("0x"substr(RT,2)):$0}" RS=%..
Megjegyzés: A -n
paraméter a GNU awk
.
Lásd: Az awk printf használata a szöveg urdekódolásához .
fájlnevek dekódolása
Ha el kell távolítania az URL kódolást a fájlnevekből, használja a deurlname
eszközt a renameutils
(pl deurlname *.*
).
Lásd még:
- Wuri dekódolhatja fájlnevek kötegelt letöltéskor?
- Hogyan lehet eltávolítani az URI kódolást a fájlnevekből?
Kapcsolódó:
- Hogyan lehet dekódolni az URL-ben kódolt karakterláncot a shellben? SO li-nél >
- Hogyan kódolhatom és dekódolhatom a százalékosan kódolt karakterláncokat a parancssorban? az Ubuntunál
megjegyzések
-
awk
:chr()
könyvtárfüggvény használata, nagy a valószínűsége, hogy kizárólag a GNU awk-n fog működni (gawk
). Ebben az esetben azonban alig lesz megfelelője a POSIXawk
-nek, mert a-n
opció (nem decimális argumentumokat engedélyezve) IS egy GNUawk
specialitás. - A
printf
-et érintő megoldásai nem veszik figyelembe ezt az URL tartalmazhat elkerült százalékjeleket, például%25
. Ezeket úgy adja át a printf-nek, hogy nem kerüli el a printf-et egy másik százalékjel, például%%
. - A bash verzióhoz
local LC_ALL=C
a tetején, különben az összes széles karakter (pl. japán, kínai stb.) nincs megfelelően bájtokra bontva. - github.com/SixArm/ urlencode.sh
- A printf verziók nem ‘ nem működnek, ha a printf BSD verzióját (pl. macOS) használják, azonban a GNU Coreutils verzió.
Válasz
Ehhez van beépített függvény a Python szabványos könyvtárában. A Python 2-ben ez “s urllib.unquote
.
decoded_url=$(python2 -c "import sys, urllib; print urllib.unquote(sys.argv[1])" "$encoded_url")
Vagy egy fájl feldolgozásához:
python2 -c "import sys, urllib; print urllib.unquote(sys.stdin.read())" <file >file.new && mv -f file.new file
A Python 3-ban ez “s urllib.parse.unquote
.
decoded_url=$(python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" "$encoded_url")
Vagy fájl feldolgozásához:
python3 -c "import sys, urllib; print(urllib.parse.unquote(sys.stdin.read()))" <file >file.new && mv -f file.new file
A Perlben használhatja a URI::Escape
.
decoded_url=$(perl -MURI::Escape -e "print uri_unescape($ARGV[0])" "$encoded_url")
Vagy egy fájl feldolgozásához:
perl -i -MURI::Escape -e "print uri_unescape($ARGV[0])" file
Ha ragaszkodni akar a POSIX hordozható eszközökhöz, akkor ” s kínos, mert az egyetlen komoly jelölt az awk, amely nem értelmezi a hexadecimális számokat. Lásd: Az awk printf használata a szöveg URL-re történő kódolásához példákat a gyakori awk-megvalósításokkal, beleértve a BusyBox-ot is.
Válasz
Perl egy vonalhajózás:
$ perl -pe "s/\%(\w\w)/chr hex $1/ge"
Példa:
$ echo "%21%22" | perl -pe "s/\%(\w\w)/chr hex $1/ge" !"
Megjegyzések
- Ez a válasz vonzó, ha nem ‘ nem akarsz foglalkozni a perl modulok telepítésével.
- Csak egy elegánsan működött számomra a MacOS-on.
- Ha egyszerre szeretné megoldani az URL-kódolás összes szintjét, ott ‘ s
perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);'
is, amely dekódolja az összes%25xx
beágyazott kódolást
Válasz
Ha egyszerű gondolkodású sed
parancsot szeretne használni, akkor használja a következőket:
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"
De kényelmesebb olyan szkriptet létrehozni, mint (mondjuk sedscript
):
s/%21/!/g s/%23/#/g s/%24/$/g s/%26/\&/g s/%27/"/g s/%28/(/g s/%29/)/g
Ezután futtassa a sed -f sedscript < old > new
parancsot, amely a kívánt módon fog kimenni.
A könnyebbség kedvéért a urlencode
parancs közvetlenül elérhető a gridsite-clients
csomag telepíthető (sudo apt-get install gridsite-clients
által Ubuntu / Debian rendszerben).
Név
urlencode – karakterláncok konvertálása URL-kódolású formába vagy URL-ből
SYNOPSIS
urlencode [-m|-d] string [string ...]
LEÍRÁS A
urlencode
karakterláncokat kódol az RFC 1738 szerint.Vagyis karakterek
A
–Z
a
–z
0
–9
.
_
és-
módosítás nélkül továbbítják, de az összes többi karakter% HH-val van ábrázolva, ahol HH a kettőjük igit nagybetűs hexadecimális ASCII ábrázolás. Például azhttp://www.gridpp.ac.uk/
URLhttp%3A%2F%2Fwww.gridpp.ac.uk%2F
urlencode
konvertálódik minden karakter a parancssorban megadott karakterláncokban. Ha több karaktersorozat van megadva, akkor az átalakítás előtt összefűzik őket elválasztó szóközökkel.OPCIÓK
-m
A teljes konvertálás helyett a GridSite “enyhe URL-kódolást” végez amelyben AZ az 0-9. = – _ @ és / és módosítatlanul kerülnek át. Ez valamivel emberileg olvashatóbb karakterláncokat eredményez, de az alkalmazásnak fel kell készülnie arra, hogy létrehozza vagy szimulálja az esetleges perjelekkel jelölt könyvtárakat.
-d
URL-dekódolást végezzen inkább mint kódolás, az RFC 1738 szerint a% HH és a% hh karakterláncokat konvertálja, a többi karakter pedig módosítatlanul kerül átadásra, azzal a kivétellel, hogy a
+
szóközgé alakul.
Példa az URL dekódolására:
$ urlencode -d "http%3a%2f%2funix.stackexchange.com%2f" http://unix.stackexchange.com/ $ urlencode -d "Example: %21, %22, . . . , %29 etc" Example: !, ", . . . , ) etc
Megjegyzések
- A
sed
látogatás - Ez egy rossz megoldás, mert minden karakter kemény kódolását megköveteli. Ezt a problémát példázza, hogy a kódból hiányzik a gyakran használt
%20
menekülési szekvencia. - @Overv I ‘ ve Felülvizsgált
- Ezenkívül érdemes még egyszer ellenőrizni a
s/%26/&/g
tevékenységét. (Kijavítottam.)
Válasz
Nem tudok megjegyzést fűzni a következőhöz: a legjobb válasz ebben a szálban , tehát itt van az enyém.
Személy szerint ezeket az álneveket használom URL kódoláshoz és dekódoláshoz:
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])""
Mindkét parancs lehetővé teszi adatok konvertálását, amelyeket parancssori argumentumként adtak át , vagy elolvasták szabványos bemenet , mert mindkét egyvonalas ellenőrzi, hogy vannak-e parancssoros argumentumok (akár üresek is), és feldolgozza, vagy csak olvassa normál bemenet egyébként.
frissítés 2017-05-23 (perjel kódolás)
A @Bevor megjegyzésére válaszul.
Ha kódolni kell a perjelet is, csak adjon hozzá egy üres második argumentumot az idézet függvényhez, ekkor a perjel is kódolásra kerül.
Tehát végül urlencode
alias a bash ban így néz ki:
alias urlencode="python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")""
vizsga 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
Megjegyzések
- Nem kódolja a perjeleket.
- @Bevor : Példa?
- Perjel hozzáadása az urlencode ” Проба пера ” – > eredmény: A perjel nincs kódolva.
- @Bevor: Igazad van. Köszönöm a megjegyzést. Válaszomat is megváltoztatom, hogy az tükrözze a megjegyzésedet.
Válasz
GNU Awk
#!/usr/bin/awk -fn @include "ord" BEGIN { RS = "%.." } { printf "%s", $0 if (RT != "") { printf "%s", chr("0x" substr(RT, 2)) } }
Válasz
És egy másik Perl-megközelítés:
#!/usr/bin/env perl use URI::Encode; my $uri = URI::Encode->new( { encode_reserved => 0 } ); while (<>) { print $uri->decode($_) }
Telepítenie kell a URI::Encode
modult. A Debian-on egyszerűen futtathattam
sudo apt-get install liburi-encode-perl
Ezután a fenti parancsfájlt futtattam egy tesztfájlon:
http://foo%21asd%23asd%24%26asd%27asd%28asd%29
Az eredmény az volt (a szkriptet foo.pl
néven mentettem el):
$ ./foo.pl http://foo!asd#asd$&asd"asd(asd)
Válasz
Válasz (főleg Posix) héjban:
$ input="%21%22" $ printf "`printf "%s\n" "$input" | sed -e "s/+/ /g" -e "s/%\(..\)/\\\\x\1/g"`" !"
Magyarázat:
-
-e "s/+/ /g
minden+
-t átalakít a térben (az ur-kódolási normában leírtak szerint) -
-e "s/%\(..\)/\\\\x\1/g"
mindegyik%XX
átalakítása a\\xXX
fájlban. Figyelje meg, hogy a\
egyikét szabályokkal idézzük. - A belső printf csak azért van, hogy átadja a bemenetet a sednek. Bármely más mechanizmussal helyettesíthetjük
- A külső printf értelmezi a
\\xXX
szekvenciákat és megjeleníti az eredményt.
Szerkesztés:
Mivel a %
-et mindig az URL-ekben kell értelmezni, egyszerűsíteni lehet ezt a választ. Ezenkívül szerintem tisztább a xargs
használata a háttérjegyzetek helyett (a @josch-nak köszönhetően).
$ input="%21%22+%25" $ printf "%s\n" "$input" | sed -e "s/+/ /g; s/%/\\x/g" | xargs -0 printf !" %
Sajnos (ahogy @josch észrevette) ezek a megoldások egyikének sem felelnek meg a Posix-kompatibilitásnak, mivel a \x
menekülési sorrend nincs meghatározva a Posix-ban.
Megjegyzések
- Üdvözöljük az U & L. oldalon! Talán meg tudnád magyarázni ezt a választ és annak működését. Általában azt részesítjük előnyben, hogy a válaszaink hosszúak legyenek, részletekkel, ne csak kódrészletekkel.
- Nagyon tetszik ez a válasz, mert ‘ átfogó, hordozható és nem ‘ nem igényelnek különlegesen nehezebb külső programokat, mint például a perl vagy a python. Jól működik nekem.
- Nagyszerű megoldás. És még rövidebb és okosabb:
... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'
. A-e
opció itt elhagyható, valójában … - @josch Igazad van, a
printf
egy beépítettdash
és ‘ nem ismeri fel a\x
menekülést. Használhatja a/usr/bin/printf
-t aprintf
helyett a működés érdekében. Általában képesnek kell lennie azcommand printf
használatára, de úgy tűnik, hogy nem úgy működik, ahogy kellene. Továbbra is használja a beépített funkciót. - @Jezz valóban a
\x
menekülés támogatása nem része a POSIX-nak: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html A tesztjeim során egy másik problémát láttam. Érdemes lecserélnie a..
regexet a következőre:[a-zA-Z0-9][a-zA-Z0-9]
, mert ellenkező esetben a következő bemenet szerepel: A% ‘ nem fog sikerülni. A végén hozzáadtam azs/%/%%/g
-t is, hogy biztosan elkerüljem a printf százalékos arányát.
Válasz
Egy másik megoldás rubint használva (az elfogadott python válasz nem működött nálam)
alias urldecode="ruby -e "require \"cgi\"; puts CGI.unescape(ARGV[0])"" alias urlencode="ruby -e "require \"cgi\"; puts CGI.escape(ARGV[0])""
példa
$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B
Megjegyzések
- Csak a rubinhoz szokott, és ezek az állítások kisebbnek tűnnek. Emellett megváltoztattam az ARGF-et. Olvastam, hogy be tudjam csatolni, mint sok más segédprogrammal!
Válasz
Itt van egy BASH függvény pontosan ehhez:
function urldecode() { echo -ne $(echo -n "$1" | sed -E "s/%/\\\\x/g") }
Megjegyzések
- varázslatként működik
- Ha
+
karaktereket akar átalakítani szóközökkel, és nem szül semmilyen folyamat, használhatja ezt:: "${1//+/ }" && echo -e "${_//%/\\x}"
Válasz
Csak héj:
$ x="a%20%25%e3%81%82";printf "${x//\%/\\x}" a %あ
--
vagy %b
, hogy megakadályozza a gondolatjelekkel kezdődő argumentumok opcióként való kezelését.
A zsh ${x//%/a}
hozzáadja a a
-t a végéhez, de a ${x//\%/a}
a %
szöveget .
Válasz
Itt vannak a releváns bitek egy másik szkriptből (amit csak szégyentelenül ellopott egy másik válaszból származó youtube.com letöltési parancsfájlomból ) írtam korábban. A (z) sed
és a shell használatával működő urldekódot hoz létre.
set \! \" \# \$ \% \& \" \( \) \* \ \+ \, \/ \: \; \= \? \@ \[ \] for c do set "$@" ""$c" "$c"; shift; done curl -s "$url" | sed "s/\\u0026/\&/g;""$( printf "s/%%%X/\\%s/g;" "$@" )"
Nem esküszöm átfogóan – és valójában kétlem -, de a YouTube-ot eléggé kezelte.
Válasz
A rövid karakterláncok (a shell lassúwww):
$ str="q+werty%3D%2F%3B" $ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n" q werty=/;