मैं कमांड लाइन पर प्रतिशत-एन्कोडेड (URL एनकोडेड) स्ट्रिंग्स को कैसे एनकोड और डीकोड कर सकता हूं ?
मैं ऐसा समाधान ढूंढ रहा हूं जो यह कर सके:
$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük
मैं कमांड लाइन पर प्रतिशत-एन्कोडेड (URL एनकोडेड) स्ट्रिंग्स को कैसे एनकोड और डीकोड कर सकता हूं ?
मैं ऐसा समाधान ढूंढ रहा हूं जो यह कर सके:
$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük
जवाबों:
ये आज्ञाएँ वही करती हैं जो आप चाहते हैं:
python -c "import urllib, sys; print urllib.quote(sys.argv[1])" æ
python -c "import urllib, sys; print urllib.unquote(sys.argv[1])" %C3%A6
यदि आप रिक्त स्थान को सांकेतिक शब्दों में बदलना चाहते हैं +
, तो प्रतिस्थापित urllib.quote
करें urllib.quote_plus
।
मुझे लगता है कि आप उन्हें उपनाम देना चाहते हैं ;-)
निम्न कमांड लाइन आज़माएं:
$ echo "%C3%A6ndr%C3%BCk" | sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
ændrük
आप इसे उपनाम के रूप में परिभाषित कर सकते हैं और इसे अपने शेल आरसी फाइलों में जोड़ सकते हैं:
$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'
फिर हर बार जब आपको इसकी आवश्यकता हो, तो बस साथ जाएं:
$ echo "http%3A%2F%2Fwww" | urldecode
http://www
स्क्रिप्टिंग करते समय, आप निम्न सिंटैक्स का उपयोग कर सकते हैं:
input="http%3A%2F%2Fwww"
decoded=$(printf '%b' "${input//%/\\x}")
हालाँकि, सिंटैक्स ऊपर से प्लसस ( +
) को सही ढंग से हैंडल नहीं करेगा , इसलिए आप उन्हें रिक्त स्थान से बदलना चाहते हैं sed
।
आप निम्नलिखित urlencode()
और urldecode()
कार्यों का भी उपयोग कर सकते हैं :
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}"
}
ध्यान दें कि आपके urld timecode () मानती है कि डेटा में कोई बैकस्लैश नहीं है।
xxd
उपकरण के साथ बैश फ़ंक्शन :
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
}
में मिला cdown के सार फ़ाइल , यह भी पर stackoverflow ।
निम्नलिखित उपनामों को परिभाषित करने का प्रयास करें:
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])"'
उपयोग:
$ urlencode "ændrük"
C%26ndrC%3Ck
$ urldecode "%C3%A6ndr%C3%BCk"
ændrük
स्रोत: रुस्लानपिवक
PHP का उपयोग करके आप निम्नलिखित कमांड आज़मा सकते हैं:
$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Or: php://stdin
oil and gas
या केवल:
php -r 'echo urldecode("oil+and+gas");'
-R
कई लाइन इनपुट के लिए उपयोग करें ।
पर्ल में आप उपयोग कर सकते हैं URI::Escape
।
decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")
या किसी फ़ाइल को संसाधित करने के लिए:
perl -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file
का उपयोग करके sed
प्राप्त किया जा सकता है:
cat file | sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' | xargs echo -e
एनोन समाधान का प्रयास करें :
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
देखें: टेक्स्ट को urldecode करने के लिए awk printf का उपयोग करना ।
यदि आपको फ़ाइल नामों से url एन्कोडिंग हटाने की आवश्यकता है, तो (जैसे ) deurlname
से टूल का उपयोग करें ।renameutils
deurlname *.*
यह भी देखें:
सम्बंधित:
%
, शायद आप के printf "$c"
साथ बदल सकते हैं printf "%c" "$c"
? एक अन्य समस्या यह है कि कुछ गैर-ASCII चरखे ä
कुछ भाषा सेटिंग्स में एन्कोडेड (जैसे ) नहीं हैं, हो सकता है export LC_ALL=C
कि फ़ंक्शन में एक जोड़ें (जो फ़ंक्शन के बाहर कुछ भी प्रभावित नहीं होनी चाहिए)?
jq -s -R -r @uri
-s
( --slurp
) इनपुट लाइनों को एक सरणी में पढ़ता है और -s -R
( --slurp --raw-input
) इनपुट को एक स्ट्रिंग में पढ़ता है। -r
( --raw-output
) JSON स्ट्रिंग शाब्दिक के बजाय स्ट्रिंग्स की सामग्री को आउटपुट करता है।
xxd -p|tr -d \\n|sed 's/../%&/g'
tr -d \\n
xxd -p
प्रत्येक 60 वर्णों के बाद जोड़े गए लाइनफ़ीड को निकालता है ।
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 ''
लाइनफीड और नल बाइट्स को छोड़ देगा। बिना IFS=
इस में पात्रों की जगह लेंगे IFS
साथ %00
। इसके बिना LC_ALL=C
उदाहरण के लिए UTF-8 लोकेल में प्रतिस्थापित あ
किया जाएगा %3042
।
मैं इस सूत्र में सर्वश्रेष्ठ उत्तर पर टिप्पणी नहीं कर सकता , इसलिए यहां मेरा है।
व्यक्तिगत रूप से, मैं URL एन्कोडिंग और डिकोडिंग के लिए इन उपनामों का उपयोग करता हूं:
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])"'
दोनों कमांड आपको डेटा को परिवर्तित करने की अनुमति देते हैं, कमांड लाइन तर्क के रूप में पारित किया जाता है या इसे मानक इनपुट से पढ़ा जाता है , क्योंकि दोनों एक-लाइनर यह जांचते हैं कि क्या कमांड लाइन तर्क हैं (यहां तक कि खाली हैं) और उन्हें संसाधित करें या बस मानक इनपुट पढ़ें अन्यथा।
... @ ममरू टिप्पणी के अनुसार।
यदि आपको स्लैश को एनकोड करने की आवश्यकता है, तो बस उद्धरण फ़ंक्शन में एक खाली दूसरा तर्क जोड़ें, फिर स्लैश को भी एन्कोड किया जाएगा।
तो, आखिरकार बाश में urlencode
उर्फ इस तरह दिखता है:
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]
कि यह अधिक उचित हो सकता है। खासकर यदि आप इसे स्क्रिप्ट में उपयोग करते हैं और गलती से एक खाली पहला तर्क देते हैं।
len(sys.argv) < 2 and sys.stdin.read()[0:-1] or sys.argv[1]
अब: sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1]
अर्थात्, यदि कोई रिक्त पहला तर्क है, तो कमांड मानक इनपुट से इनपुट की प्रतीक्षा नहीं करता है, लेकिन एक खाली तर्क संसाधित करता है।
मुझे एक पैकेज मिला renameutils
, जिसमें उपयोगिता है deurlname
जो "प्रतिशत-एन्कोडेड" वर्णों वाली फ़ाइल का नाम बदलने में सक्षम है।
दुर्भाग्य से, यह स्टड या कमांड लाइन विकल्प को डिकोड नहीं करता है, लेकिन केवल एक फ़ाइल का नाम बदलें, इसलिए आपको डिकोडिंग (पुनर्नामित फ़ाइल का नाम) प्राप्त करने के लिए एक डमी फ़ाइल बनानी होगी, लेकिन कुछ बैश स्क्रिप्टिंग के साथ प्रक्रिया को स्वचालित किया जा सकता है ।
एन्कोडिंग भाग के बारे में कोई जानकारी नहीं है, यहां तक कि क्योंकि यह संदिग्ध हो सकता है कि किस वर्ण को एनकोड करना है। केवल गैर-एएससीआईआई?
मुझे लगता है कि कुछ बेहतर उपकरण / विधि होनी चाहिए।
स्टीफनो एंसर के समान लेकिन पायथन 3 में:
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
एनकोडिंग के लिए भी स्लैश:
python -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\"))"
यहाँ अंतर के बारे में अधिक जानकारी ।
यहाँ एन्कोडिंग के लिए एक POSIX Awk फ़ंक्शन है:
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
मेरे लिए (मानक) UTF8 की तरह नहीं दिखता है। या यह सिर्फ एक उदाहरण है?