Komut satırında yüzde kodlu (URL kodlanmış) dizeleri nasıl kodlayabilir ve kodunu çözebilirim ?
Bunu yapabilen bir çözüm arıyorum:
$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük
Komut satırında yüzde kodlu (URL kodlanmış) dizeleri nasıl kodlayabilir ve kodunu çözebilirim ?
Bunu yapabilen bir çözüm arıyorum:
$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük
Yanıtlar:
Bu komutlar ne istersen onu yapar:
python -c "import urllib, sys; print urllib.quote(sys.argv[1])" æ
python -c "import urllib, sys; print urllib.unquote(sys.argv[1])" %C3%A6
Eğer olarak kodlamak boşluk istiyorsanız +
, yerini urllib.quote
ile urllib.quote_plus
.
Sanırım onları takma isimlendirmek isteyeceksiniz ;-)
Aşağıdaki komut satırını deneyin:
$ echo "%C3%A6ndr%C3%BCk" | sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
ændrük
Bunu takma ad olarak tanımlayabilir ve kabuk rc dosyalarınıza ekleyebilirsiniz :
$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'
Sonra her ihtiyacın olduğunda, sadece git:
$ echo "http%3A%2F%2Fwww" | urldecode
http://www
Komut dosyası yazarken aşağıdaki sözdizimini kullanabilirsiniz:
input="http%3A%2F%2Fwww"
decoded=$(printf '%b' "${input//%/\\x}")
Ancak yukarıdaki sözdizimi pluses ( +
) işlevini doğru işlemez , bu nedenle onları boşluklarla değiştirmelisiniz sed
.
Aşağıdakileri urlencode()
ve urldecode()
işlevleri de kullanabilirsiniz :
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}"
}
Urldecode () verilerinin ters eğik çizgi içermediğini varsaydığını unutmayın.
xxd
Aracı ile Bash işlevi :
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
}
Bulundu cdown en özü dosyası ayrıca, stackoverflow .
Aşağıdaki takma adları tanımlamayı deneyin:
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])"'
Kullanımı:
$ urlencode "ændrük"
C%26ndrC%3Ck
$ urldecode "%C3%A6ndr%C3%BCk"
ændrük
Kaynak: ruslanspivak
PHP kullanarak aşağıdaki komutu deneyebilirsiniz:
$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Or: php://stdin
oil and gas
ya da sadece:
php -r 'echo urldecode("oil+and+gas");'
-R
Çoklu hat girişi için kullanın .
Perl'de kullanabilirsiniz URI::Escape
.
decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")
Veya bir dosyayı işlemek için:
perl -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file
Kullanarak sed
elde edilebilir:
cat file | sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' | xargs echo -e
Deneyin anon çözüm:
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
Bakınız: Metnin kodunu değiştirmek için awk printf kullanımı .
URL kodlamasını dosya adlarından kaldırmanız gerekirse deurlname
, renameutils
(örneğin deurlname *.*
) aracını kullanın .
Ayrıca bakınız:
İlgili:
%
, belki yerini alabilir printf "$c"
ile printf "%c" "$c"
? Başka bir sorun da bazı ASCII olmayan karakterlerin ä
bazı dil ayarlarında kodlanmadığı (örneğin ), belki bir export LC_ALL=C
işlev ekleyebilmesidir (işlev dışında hiçbir şeyi etkilememesi gereken)?
jq -s -R -r @uri
-s
( --slurp
) giriş satırlarını bir diziye okur ve -s -R
( --slurp --raw-input
) girişi tek bir dizeye okur. -r
( --raw-output
), JSON string değişmezleri yerine dizelerin içeriğini çıkarır.
xxd -p|tr -d \\n|sed 's/../%&/g'
tr -d \\n
xxd -p
Her 60 karakterden sonra eklenen satır beslemelerini kaldırır .
eu () {
local LC_ALL=C c
while IFS= read -r -n1 -d '' c
do
if [[ $c = [[:alnum:]] ]]
then
printf %s "$c"
else
printf %%%02x "'$c"
fi
done
}
-d ''
Bu olmadan satır beslemeleri ve boş baytlar atlanırdı. Without IFS=
bu karakterleri yerini alacak IFS
olan %00
. Without LC_ALL=C
Bu örnek için yerini alacak あ
olan %3042
UTF-8 yerel ayarda.
Bu konudaki en iyi cevap hakkında yorum yapamam , bu yüzden işte benim.
Şahsen bu takma adları URL kodlama ve kod çözme için kullanırım:
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])"'
Her iki komut da verileri dönüştürmenize, komut satırı argümanı olarak geçirmenize veya standart girdiden okumanıza olanak tanır , çünkü her iki tek gömlek komut satırı argümanları olup olmadığını kontrol eder (hatta boş olanları) ve bunları işler veya yalnızca standart girişi okur.
... muru yorumuna göre.
Eğer eğik çizgiyi de kodlamanız gerekiyorsa, sadece teklif fonksiyonuna boş bir ikinci argüman ekleyin, o zaman eğik çizgi de kodlanacaktır.
Yani, son olarak urlencode
takma içinde bash böyle görünüyor:
alias urlencode='python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")"'
$ 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
sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1]
daha uygun olabilir. Özellikle bunu komut dosyalarında kullanırsanız ve yanlışlıkla boş bir ilk argüman verirseniz.
len(sys.argv) < 2 and sys.stdin.read()[0:-1] or sys.argv[1]
Şimdi: sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1]
Boş bir ilk argüman bile varsa, komut standart girdiden giriş beklemiyor, ancak boş bir argüman işliyor.
"Yüzde kodlanmış" karakterleri içeren bir dosyayı yeniden adlandırabilen renameutils
yardımcı programı içeren bir paket buldum deurlname
.
Ne yazık ki, stdin veya bir komut satırı seçeneğinin kodunu çözmez, ancak yalnızca bir dosyayı yeniden adlandırır, bu nedenle kod çözmeyi elde etmek için sahte bir dosya oluşturmanız gerekir (yeniden adlandırılmış dosyanın adı), ancak bazı bash komut dosyasıyla işlem otomatikleştirilebilir .
Hangi karakterlerin kodlanacağı sorgulanabilir olsa bile kodlama kısmı hakkında bilgi yoktur. Sadece ASCII olmayan?
Daha iyi bir araç / yöntem olması gerektiğini düşünüyorum.
Stefano ansqer'a benzer ancak Python 3'te:
python -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1]))" æ
python -c "import urllib.parse, sys; print(urllib.parse.unquote(sys.argv[1]))" %C3%A6
Ayrıca eğik çizgi kodlamak için:
python -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\"))"
Buradaki fark hakkında daha fazla bilgi .
İşte kodlama için bir POSIX Awk işlevi:
function encodeURIComponent(str, j, q) {
while (y++ < 125) z[sprintf("%c", y)] = y
while (y = substr(str, ++j, 1))
q = y ~ /[[:alnum:]_.!~*\47()-]/ ? q y : q sprintf("%%%02X", z[y])
return q
}
%E6ndr%FCk
bana (standart) UTF8 gibi görünmüyor. Ya da sadece bir örnek?