कमांड लाइन पर मैं कैसे एन्कोड और प्रतिशत-एन्कोडेड स्ट्रिंग्स को डीकोड कर सकता हूं?


31

मैं कमांड लाइन पर प्रतिशत-एन्कोडेड (URL एनकोडेड) स्ट्रिंग्स को कैसे एनकोड और डीकोड कर सकता हूं ?

मैं ऐसा समाधान ढूंढ रहा हूं जो यह कर सके:

$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük

क्या आप अलग-अलग एनकोडिंग को भी शामिल करना चाहते हैं? %E6ndr%FCkमेरे लिए (मानक) UTF8 की तरह नहीं दिखता है। या यह सिर्फ एक उदाहरण है?
व्यवस्था करें

@arrange कि पकड़ने के लिए धन्यवाद। जाहिर तौर पर मैंने ऑनलाइन कन्वर्टर्स के लिए खोज परिणामों के बीच खराब सेब को चुना ।
ændrük

जवाबों:


35

ये आज्ञाएँ वही करती हैं जो आप चाहते हैं:

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

मुझे लगता है कि आप उन्हें उपनाम देना चाहते हैं ;-)


1
पहली पंक्ति के अंत में वह is वर्ण क्या है? संपादित करें: अपने आप को जवाब देना - मिल गया, यह उदाहरण के उद्देश्य के लिए बस एक ही चरित्र UTF8 टू-बी-एन्कोडेड स्ट्रिंग है :-)
TMG

1
कैसे python3 के बारे में?
रिकार्डो


27

खोल

निम्न कमांड लाइन आज़माएं:

$ 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 () मानती है कि डेटा में कोई बैकस्लैश नहीं है।


bash + xxd

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

का उपयोग करके sedप्राप्त किया जा सकता है:

cat file | sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' | xargs echo -e

awk

एनोन समाधान का प्रयास करें :

awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..

देखें: टेक्स्ट को urldecode करने के लिए awk printf का उपयोग करना


डिकोडिंग फ़ाइल नाम

यदि आपको फ़ाइल नामों से url एन्कोडिंग हटाने की आवश्यकता है, तो (जैसे ) deurlnameसे टूल का उपयोग करें ।renameutilsdeurlname *.*

यह भी देखें:


सम्बंधित:


बैश + xxd संस्करण उन स्ट्रिंग्स के साथ काम नहीं करता है जिनमें एक %, शायद आप के printf "$c"साथ बदल सकते हैं printf "%c" "$c"? एक अन्य समस्या यह है कि कुछ गैर-ASCII चरखे äकुछ भाषा सेटिंग्स में एन्कोडेड (जैसे ) नहीं हैं, हो सकता है export LC_ALL=Cकि फ़ंक्शन में एक जोड़ें (जो फ़ंक्शन के बाहर कुछ भी प्रभावित नहीं होनी चाहिए)?
12431234123412341234123

8

प्रतिशत-सांकेतिक शब्दों में सुरक्षित URI वर्ण और गैर- ASCII वर्ण

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 \\nxxd -pप्रत्येक 60 वर्णों के बाद जोड़े गए लाइनफ़ीड को निकालता है ।

बैश में ASCII अल्फ़ान्यूमेरिक वर्णों को छोड़कर सभी वर्णों को प्रतिशत-एन्कोड करें

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


5

केवल डिकोडिंग के लिए शुद्ध बैश समाधान :

$ a='%C3%A6ndr%C3%BCk'
$ echo -e "${a//%/\\x}"
ændrük

4

मैं इस सूत्र में सर्वश्रेष्ठ उत्तर पर टिप्पणी नहीं कर सकता , इसलिए यहां मेरा है।

व्यक्तिगत रूप से, मैं 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])"'

दोनों कमांड आपको डेटा को परिवर्तित करने की अनुमति देते हैं, कमांड लाइन तर्क के रूप में पारित किया जाता है या इसे मानक इनपुट से पढ़ा जाता है , क्योंकि दोनों एक-लाइनर यह जांचते हैं कि क्या कमांड लाइन तर्क हैं (यहां तक ​​कि खाली हैं) और उन्हें संसाधित करें या बस मानक इनपुट पढ़ें अन्यथा।

अपडेट 2015-07-16 (खाली 1 arg)

... @ ममरू टिप्पणी के अनुसार।

अपडेट 2017-05-28 (स्लैश एन्कोडिंग)

यदि आपको स्लैश को एनकोड करने की आवश्यकता है, तो बस उद्धरण फ़ंक्शन में एक खाली दूसरा तर्क जोड़ें, फिर स्लैश को भी एन्कोड किया जाएगा।

तो, आखिरकार बाश में 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

1
मुझे लगता है 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] अर्थात्, यदि कोई रिक्त पहला तर्क है, तो कमांड मानक इनपुट से इनपुट की प्रतीक्षा नहीं करता है, लेकिन एक खाली तर्क संसाधित करता है।
डीआईजी mbl

2

मुझे एक पैकेज मिला renameutils, जिसमें उपयोगिता है deurlnameजो "प्रतिशत-एन्कोडेड" वर्णों वाली फ़ाइल का नाम बदलने में सक्षम है।

दुर्भाग्य से, यह स्टड या कमांड लाइन विकल्प को डिकोड नहीं करता है, लेकिन केवल एक फ़ाइल का नाम बदलें, इसलिए आपको डिकोडिंग (पुनर्नामित फ़ाइल का नाम) प्राप्त करने के लिए एक डमी फ़ाइल बनानी होगी, लेकिन कुछ बैश स्क्रिप्टिंग के साथ प्रक्रिया को स्वचालित किया जा सकता है ।

एन्कोडिंग भाग के बारे में कोई जानकारी नहीं है, यहां तक ​​कि क्योंकि यह संदिग्ध हो सकता है कि किस वर्ण को एनकोड करना है। केवल गैर-एएससीआईआई?

मुझे लगता है कि कुछ बेहतर उपकरण / विधि होनी चाहिए।


1

स्टीफनो एंसर के समान लेकिन पायथन 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], \"\"))"

यहाँ अंतर के बारे में अधिक जानकारी ।


0

यहाँ एन्कोडिंग के लिए एक 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
}

उदाहरण

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.