Saya ingin mendekodekan penyandian URL, apakah ada alat bawaan untuk melakukan ini atau ada yang bisa memberi saya sed
kode yang akan melakukan ini?
Saya memang mencari sedikit melalui unix.stackexchange.com dan di internet tetapi saya tidak dapat menemukan alat baris perintah untuk decoding encoding url.
Yang ingin saya lakukan hanyalah mengedit txt
file sehingga:
%21
menjadi!
%23
menjadi#
%24
menjadi$
%26
menjadi&
%27
menjadi'
%28
menjadi(
%29
menjadi)
Dan seterusnya.
shell-script
text-processing
sed
url
Nama tampilan
sumber
sumber
Jawaban:
Temukan Python one liners ini yang melakukan apa yang Anda inginkan:
Contoh
Referensi
sumber
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
3 secara default, ini akan menghasilkan kesalahan. Mengubahpython
untukpython2
membantu.python3
Anda dapat menggunakanimport urllib.parse as ul
sebagai gantinyaimport urllib as ul
.sed
Coba baris perintah berikut:
atau alternatif berikut menggunakan
echo -e
:Catatan: Sintaks di atas mungkin tidak dikonversi
+
ke spasi, dan dapat memakan semua baris baru.Anda dapat mendefinisikannya sebagai alias dan menambahkannya ke file rc shell Anda :
Lalu setiap kali Anda membutuhkannya, cukup ikuti:
Pesta
Saat membuat skrip, Anda dapat menggunakan sintaks berikut:
Namun sintaks di atas tidak akan menangani plus (
+
) dengan benar, jadi Anda harus menggantinya dengan spasi viased
.Anda juga dapat menggunakan fungsi
urlencode()
dan berikut iniurldecode()
:Berikut ini adalah versi Joel serupa yang ditemukan di: https://github.com/sixarm/urldecode.sh
bash + xxd
Fungsi Bash dengan
xxd
alat:Ditemukan di file inti cdown , juga di stackoverflow .
PHP
Menggunakan PHP Anda dapat mencoba perintah berikut:
atau hanya:
Gunakan
-R
untuk input baris ganda.Perl
Di Perl Anda dapat menggunakan
URI::Escape
.Atau untuk memproses file:
awk
Coba solusi anon :
Catatan: Parameter
-n
khusus untuk GNUawk
.Lihat: Menggunakan awk printf untuk urldecode teks .
nama file decoding
Jika Anda perlu menghapus penyandian url dari nama file, gunakan
deurlname
alat darirenameutils
(misdeurlname *.*
.).Lihat juga:
Terkait:
sumber
awk
: Karena ini menggunakan fungsi perpustakaanchr()
,, ada kemungkinan besar itu hanya akan berfungsi pada GNU awk (gawk
). Namun, dalam kasus ini hampir tidak ada yang setara untuk POSIXawk
, karena-n
opsi (memungkinkan argumen non-desimal) ADALAHawk
spesialisasi GNU .sed
Kode pertama Anda memberi sayaxargs: argument line too long
file dengan ≥2164 baris.printf
tidak memperhitungkan bahwa url mungkin mengandung tanda persentase yang lolos seperti%25
. Anda meneruskan ini ke printf tanpa melarikan mereka untuk printf dengan tanda persentase lain seperti%%
.local LC_ALL=C
di bagian atas, jika tidak semua karakter lebar (yaitu Jepang, Cina, dll.) Tidak benar-benar dipecah menjadi byte.Ada fungsi bawaan untuk itu di pustaka standar Python. Dalam Python 2, itu
urllib.unquote
.Atau untuk memproses file:
Dalam Python 3, itu
urllib.parse.unquote
.Atau untuk memproses file:
Di Perl Anda dapat menggunakan
URI::Escape
.Atau untuk memproses file:
Jika Anda ingin tetap menggunakan alat portabel POSIX, itu aneh, karena satu-satunya kandidat yang serius adalah awk, yang tidak menguraikan angka heksadesimal. Lihat Menggunakan awk printf ke urldecode teks untuk contoh dengan implementasi awk yang umum, termasuk BusyBox.
sumber
Jika Anda ingin menggunakan
sed
perintah yang berpikiran sederhana , maka gunakan yang berikut ini:Tetapi lebih mudah untuk membuat skrip seperti (katakanlah
sedscript
):Kemudian jalankan
sed -f sedscript < old > new
, yang akan menampilkan seperti yang Anda inginkan.Untuk kemudahan, perintah
urlencode
ini juga tersedia langsung dalamgridsite-clients
paket yang dapat diinstal dari (olehsudo apt-get install gridsite-clients
dalam sistem Ubuntu / Debian).Contoh URL penguraian:
sumber
sed
kunjungan%20
urutan pelarian yang sering digunakan .s/%26/&/g
terjadi. (Saya memperbaikinya.)Perl satu liner:
Contoh:
sumber
GNU awk
Atau
Konversikan URL file yang disandikan persen ke file lokal di bash
sumber
Saya tidak dapat mengomentari jawaban terbaik di utas ini , jadi inilah milik saya.
Secara pribadi, saya menggunakan alias ini untuk penyandian dan penguraian URL:
Kedua perintah memungkinkan Anda untuk mengkonversi data, diteruskan sebagai argumen baris perintah atau membacanya dari input standar , karena keduanya satu-baris memeriksa apakah ada argumen baris perintah (bahkan yang kosong) dan memprosesnya atau hanya membaca input standar jika tidak.
perbarui 2017-05-23 (penyandian slash)
Menanggapi komentar @ Bevor.
Jika Anda juga perlu menyandikan slash, cukup tambahkan argumen kosong kedua ke fungsi kutipan, maka slash juga akan disandikan.
Jadi, akhirnya
urlencode
alias dalam bash terlihat seperti ini:Contoh
sumber
Dan pendekatan Perl lainnya:
Anda perlu menginstal
URI::Encode
modul. Di Debian saya, saya bisa berlariKemudian, saya menjalankan skrip di atas pada file uji yang berisi:
Hasilnya adalah (saya telah menyimpan skrip sebagai
foo.pl
):sumber
Sebuah jawaban dalam shell (kebanyakan Posix):
Penjelasan:
-e 's/+/ /g
mentransformasikan masing-masing+
dalam ruang (seperti yang dijelaskan dalam norma url-encode)-e 's/%\(..\)/\\\\x\1/g'
mengubah setiap%XX
di\\xXX
. Pemberitahuan salah satu\
akan dihapus dengan mengutip aturan.\\xXX
urutan dan hasil tampilan.Sunting:
Karena
%
harus selalu ditafsirkan dalam URL, dimungkinkan untuk menyederhanakan jawaban ini. Selain itu, saya pikir lebih bersih untuk menggunakanxargs
daripada backquotes (terima kasih kepada @josch).Sayangnya, (seperti yang diperhatikan @josch) tidak ada solusi ini yang sesuai dengan Posix karena
\x
urutan escape tidak didefinisikan dalam Posix.sumber
... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'
. The-e
pilihan dapat dihilangkan di sini sebenarnya ...printf
adalah built-indash
dan tidak mengenali\x
pelarian. Anda dapat menggunakannya/usr/bin/printf
sebagai gantinyaprintf
untuk membuatnya berfungsi. Biasanya, Anda harus dapat menggunakancommand printf
, tetapi tampaknya tidak berfungsi sebagaimana mestinya. Itu terus menggunakan built-in.\x
melarikan diri bukan bagian dari POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html Selama pengujian saya, saya melihat masalah lain. Anda mungkin ingin mengganti..
regex dengan[a-zA-Z0-9][a-zA-Z0-9]
karena jika tidak, input seperti '%%%' akan gagal. Saya juga menambahkans/%/%%/g
di akhir untuk memastikan lolos dari persentase untuk printf.Khusus shell:
Tambah
--
atau%b
untuk mencegah argumen yang dimulai dengan tanda hubung diperlakukan sebagai opsi.In zsh
${x//%/a}
menambaha
akhir tetapi${x//\%/a}
menggantikan%
dengana
.sumber
Berikut ini adalah bit yang relevan dari skrip lain (yang tanpa malu-malu saya mencuri dari skrip unduhan youtube.com dari jawaban lain) yang pernah saya tulis sebelumnya. Ia menggunakan
sed
dan shell untuk membangun urldecode yang berfungsi.Saya tidak akan bersumpah ini komprehensif - dan sebenarnya saya ragu - tapi itu menangani youtube cukup jelas.
sumber
Berikut adalah fungsi BASH untuk melakukan hal itu:
sumber
Solusi lain menggunakan ruby (jawaban python yang diterima tidak bekerja untuk saya)
Contoh
sumber