কমান্ড লাইনে আমি কীভাবে শতাংশ-এনকোডেড (ইউআরএল এনকোডড) স্ট্রিংগুলি এনকোড এবং ডিকোড করতে পারি ?
আমি এমন একটি সমাধান খুঁজছি যা এটি করতে পারে:
$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük
কমান্ড লাইনে আমি কীভাবে শতাংশ-এনকোডেড (ইউআরএল এনকোডড) স্ট্রিংগুলি এনকোড এবং ডিকোড করতে পারি ?
আমি এমন একটি সমাধান খুঁজছি যা এটি করতে পারে:
$ 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}"
}
নোট করুন যে আপনার urldecode () ধরে নিয়েছে যে ডেটাতে কোনও ব্যাকস্ল্যাশ নেই।
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
সূত্র: রাস্লানস্পিবক
পিএইচপি ব্যবহার করে আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:
$ 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 প্রিন্টফ ব্যবহার করা ।
আপনার যদি ফাইলের নামগুলি থেকে url এনকোডিং অপসারণ করতে deurlname
হয় তবে renameutils
(যেমন উদাহরণস্বরূপ) থেকে সরঞ্জামটি ব্যবহার করুনdeurlname *.*
) ।
আরো দেখুন:
সম্পর্কিত:
%
, আপনি হয়ত প্রতিস্থাপন করতে পারে printf "$c"
সঙ্গে printf "%c" "$c"
? অন্য একটি সমস্যাটি হ'ল কিছু অ্যাস্কিআই চর্যাচটারগুলি ä
কিছু ভাষা সেটিংসে এনকোড করা হয়নি (যেমন ) 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
এই উদাহরণস্বরূপ প্রতিস্থাপন করবে あ
সঙ্গে %3042
একটি হল UTF-8 লোকেলে।
আমি এই থ্রেডে সেরা উত্তরের বিষয়ে মন্তব্য করতে পারি না , সুতরাং এটি আমার।
ব্যক্তিগতভাবে, আমি ইউআরএল এনকোডিং এবং ডিকোডিংয়ের জন্য এই উপকরণগুলি ব্যবহার করি:
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
যা "শতাংশ-এনকোডড" অক্ষরযুক্ত ফাইলটির নাম পরিবর্তন করতে সক্ষম।
দুর্ভাগ্যক্রমে, এটি স্টিডিন বা কমান্ড লাইন বিকল্পটি ডিকোড করে না, কেবল একটি ফাইলের নাম পরিবর্তন করে, তাই ডিকোডিং (পুনরায় নামকরণ করা ফাইলের নাম) পেতে আপনাকে একটি ডামি ফাইল তৈরি করতে হবে, তবে কিছু বাশ স্ক্রিপ্টিংয়ের মাধ্যমে প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে পরিচালিত হতে পারে ।
এনকোডিং অংশটি সম্পর্কে কোনও তথ্য নয়, এমনকি কোন অক্ষরটি এনকোড করা উচিত তা প্রশ্নযুক্ত হতে পারে বলেও। শুধু নন-এএসসিআইআই?
আমি মনে করি আরও ভাল কিছু সরঞ্জাম / পদ্ধতি থাকা উচিত।
অনুরূপ স্টেফানো ansqer কিন্তু পাইথন 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], \"\"))"
পার্থক্য সম্পর্কে আরও তথ্য এখানে ।
এনকোডিংয়ের জন্য এখানে একটি পসিক্স আওক ফাংশন রয়েছে:
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
আমার কাছে (স্ট্যান্ডার্ড) ইউটিএফ 8 এর মতো দেখাচ্ছে না। নাকি এটি একটি উদাহরণ?