Chcę zdekodować kodowanie adresu URL. Czy jest do tego jakieś wbudowane narzędzie, czy ktoś może dostarczyć mi sed
kod, który to zrobi?
Szukałem trochę w unix.stackexchange.com i w Internecie, ale nie mogłem znaleźć żadnego narzędzia wiersza poleceń do dekodowania kodowania URL.
Chcę po prostu edytować txt
plik, aby:
%21
staje się!
%23
staje się#
%24
staje się$
%26
staje się&
%27
staje się'
%28
staje się(
%29
staje się)
I tak dalej.
shell-script
text-processing
sed
url
Wyświetlana nazwa
źródło
źródło
Odpowiedzi:
Znaleziono te linijki Pythona, które robią, co chcesz:
Przykład
Bibliografia
źródło
cat your_lovely_file.csv| python -c "import sys, urllib as ul; [sys.stdout.write(ul.quote_plus(l)) for l in sys.stdin]"
python
domyślnie jest 3, spowoduje to błąd. Zmianapython
napython2
pomoc.python3
można użyćimport urllib.parse as ul
zamiastimport urllib as ul
.sed
Wypróbuj następującą linię poleceń:
lub następująca alternatywa przy użyciu
echo -e
:Uwaga: powyższa składnia może nie być konwertowana
+
na spacje i może zjadać wszystkie znaki nowej linii.Możesz zdefiniować go jako alias i dodać do plików RC powłoki :
Następnie za każdym razem, gdy jej potrzebujesz, po prostu skorzystaj z:
Grzmotnąć
Podczas pisania skryptów możesz użyć następującej składni:
Jednak powyższa składnia nie będzie
+
poprawnie obsługiwać plusów ( ), więc musisz zastąpić je spacjami przezsed
.Możesz także użyć następujących funkcji
urlencode()
iurldecode()
funkcji:Oto podobna wersja Joela znaleziona na: https://github.com/sixarm/urldecode.sh
bash + xxd
Funkcja Bash z
xxd
narzędziem:Znalezione w pliku gist cdown , również w stackoverflow .
PHP
Za pomocą PHP możesz wypróbować następujące polecenie:
Lub tylko:
Użyj
-R
do wprowadzania wielu linii.Perl
W Perlu możesz używać
URI::Escape
.Lub przetworzyć plik:
awk
Wypróbuj rozwiązanie anonowe :
Uwaga: parametr
-n
jest specyficzny dla GNUawk
.Zobacz: Używanie awk printf do kodu urldecode .
dekodowanie nazw plików
Jeśli chcesz usunąć kodowanie adresu URL z nazw plików, użyj
deurlname
narzędzia zrenameutils
(npdeurlname *.*
.).Zobacz też:
Związane z:
źródło
awk
: Ponieważ korzysta z funkcji bibliotecznejchr()
, istnieje duże prawdopodobieństwo, że będzie działać wyłącznie na GNU awk (gawk
). Jednak w tym przypadku nie będzie prawie żadnego odpowiednika POSIXawk
, ponieważ-n
opcja (dopuszczenie argumentów nie dziesiętnych) JESTawk
specjalnością GNU .sed
kod daje mixargs: argument line too long
plik z ≥2164 liniami.printf
nie biorą pod uwagę, że adres URL może zawierać znaki procentu ucieczki, takie jak%25
. Przekazujesz je do printf bez uciekania ich do printf z innym znakiem procentowym, takim jak%%
.local LC_ALL=C
u góry, w przeciwnym razie wszystkie szerokie znaki (tj. Japoński, chiński itp.) Nie zostaną poprawnie podzielone na bajty.Jest to wbudowana funkcja w standardowej bibliotece Pythona. W Pythonie 2 jest to
urllib.unquote
.Lub przetworzyć plik:
W Pythonie 3 jest to
urllib.parse.unquote
.Lub przetworzyć plik:
W Perlu możesz używać
URI::Escape
.Lub przetworzyć plik:
Jeśli chcesz trzymać się przenośnych narzędzi POSIX, jest to niewygodne, ponieważ jedynym poważnym kandydatem jest awk, który nie analizuje liczb szesnastkowych. Zobacz Używanie awk printf do urldecode tekstu, aby zapoznać się z przykładami typowych implementacji awk, w tym BusyBox.
źródło
Jeśli chcesz użyć prostego
sed
polecenia, wykonaj następujące czynności:Ale wygodniej jest utworzyć skrypt taki jak (powiedzmy
sedscript
):Następnie uruchom
sed -f sedscript < old > new
, który wyświetli, jak chcesz.Dla ułatwienia polecenie
urlencode
jest również dostępne bezpośrednio wgridsite-clients
pakiecie, z którego można zainstalować (sudo apt-get install gridsite-clients
w systemie Ubuntu / Debian).Przykład dekodowania adresu URL:
źródło
sed
wizyty%20
sekwencji specjalnej.s/%26/&/g
robi. (Naprawiłem to.)Jedna wkładka Perl:
Przykład:
źródło
GNU awk
Lub
Konwertuj adres URL pliku zakodowanego procentowo na plik lokalny w bash
źródło
Nie mogę komentować najlepszej odpowiedzi w tym wątku , więc oto moja.
Osobiście używam tych aliasów do kodowania i dekodowania adresów URL:
Oba polecenia pozwalają na konwersję danych przekazywanych jako argument wiersza poleceń lub odczytanie go ze standardowego wejścia , ponieważ oba wiersze jednowierszowe sprawdzają, czy istnieją argumenty wiersza polecenia (nawet puste), i przetwarzają je, lub po prostu czytają standardowe wejście w inny sposób.
aktualizacja 2017-05-23 (kodowanie ukośnika)
W odpowiedzi na komentarz @ Bevor.
Jeśli musisz również zakodować ukośnik, po prostu dodaj pusty drugi argument do funkcji cudzysłowu, ukośnik również zostanie zakodowany.
Ostatecznie
urlencode
alias w bash wygląda następująco:Przykład
źródło
I inne podejście do Perla:
Będziesz musiał zainstalować
URI::Encode
moduł. Na moim Debianie mogłem po prostu biecNastępnie uruchomiłem powyższy skrypt na pliku testowym zawierającym:
Wynik był (zapisałem skrypt jako
foo.pl
):źródło
Odpowiedź w powłoce (głównie Posix):
Wyjaśnienie:
-e 's/+/ /g
przekształca każdą+
w przestrzeni (jak opisano w normie kodowania URL)-e 's/%\(..\)/\\\\x\1/g'
przekształcić każdy%XX
w\\xXX
. Zauważ, że jeden z nich\
zostanie usunięty przez cytowanie reguł.\\xXX
sekwencje i wyświetla wynik.Edytować:
Ponieważ
%
należy zawsze interpretować w adresach URL, można uprościć tę odpowiedź. W dodatku, myślę, że jest czystsze używaćxargs
zamiast małe cudzysłowy (dzięki @josch).Niestety (jak zauważył @josch) żadne z tych rozwiązań nie jest zgodne z Posix, ponieważ
\x
sekwencja ucieczki nie jest zdefiniowana w Posix.źródło
... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'
. W-e
rzeczywistości tutaj można pominąć tę opcję ...printf
jest wbudowanydash
i nie rozpoznaje\x
ucieczki. Możesz użyć/usr/bin/printf
zamiastprintf
, aby to zadziałało. Zwykle powinieneś być w stanie korzystaćcommand printf
, ale wydaje się, że nie działa tak, jak powinien. Nadal używa wbudowanego.\x
ucieczki nie jest częścią POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html Podczas moich testów widziałem inny problem. Możesz zamienić..
wyrażenie regularne na,[a-zA-Z0-9][a-zA-Z0-9]
ponieważ w przeciwnym razie wprowadzanie typu „%%%” zakończy się niepowodzeniem. Dodałem równieżs/%/%%/g
na końcu, aby upewnić się, że nie ma wartości procentowych dla printf.Tylko skorupa:
Dodaj
--
lub,%b
aby nie traktować argumentów rozpoczynających się od myślnika jako opcji.W Zsh
${x//%/a}
dodajea
się do końca, ale${x//\%/a}
zastępuje%
sięa
.źródło
Oto odpowiednie fragmenty z innego skryptu (który bezwstydnie ukradłem z mojego skryptu pobierania youtube.com z innej odpowiedzi) , który napisałem wcześniej. Używa
sed
i powłoki do zbudowania działającego kodu urld.Nie przysięgam, że jest obszerny - i faktycznie w to wątpię - ale z pewnością poradził sobie z youtube.
źródło
Oto funkcja BASH, aby dokładnie to zrobić:
źródło
Inne rozwiązanie wykorzystujące ruby (zaakceptowana odpowiedź python nie działała dla mnie)
Przykład
źródło