URL 인코딩 디코딩 (백분율 인코딩)

URL 인코딩을 디코딩하고 싶습니다.이 작업을 수행하는 내장 도구가 있습니까? 아니면 누구든지 sed이 작업을 수행 할 코드?

unix.stackexchange.com 과 인터넷에서 약간 검색했지만 디코딩을위한 명령 줄 도구를 찾을 수 없습니다. URL 인코딩입니다.

제가 원하는 것은 txt 파일을 다음과 같이 수정하는 것입니다.

  • %21!
  • 가됩니다.

  • %23#
  • %24$
  • 가됩니다.

  • %26&
  • 가됩니다.

  • %27"가됩니다.
  • %28(
  • 이됩니다.

  • %29)

등이됩니다.

댓글

답변

원하는 작업을 수행하는 Python 하나의 라이너를 찾았습니다.

Python2

$ 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])"" 

Python3

$ alias urldecode="python3 -c "import sys, urllib.parse as ul; \ print(ul.unquote_plus(sys.argv[1]))"" $ alias urlencode="python3 -c "import sys, urllib.parse as ul; \ print (ul.quote_plus(sys.argv[1]))"" 

$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B 

참조

댓글

  • 아주 늦게 알고 있습니다. ,하지만 내부 편집으로이 작업을 수행 할 수있는 방법이 있습니까?
  • @DisplayName-새로운 Q처럼 들립니다. 나는 ‘ 물어보고 이것을 참조합니다.
  • 스트리밍 : cat your_lovely_file.csv| python -c "import sys, urllib as ul; [sys.stdout.write(ul.quote_plus(l)) for l in sys.stdin]"
  • stdin과 함께 작동하는 답변은 @DIG mbl ‘의 답변을 참조하십시오.

Answer

sed

다음 명령 줄을 사용해보세요.

$ sed "s@+@ @g;s@%@\\x@g" file | xargs -0 printf "%b" 

또는 :

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

참고 : 위 구문은 +를 변환 할 수 없습니다. 공백에 추가하고 모든 줄 바꿈을 먹을 수 있습니다.


별명으로 정의하고 쉘 rc 파일에 추가 할 수 있습니다.

$ alias urldecode="sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"" 

그런 다음 필요할 때마다 다음을 사용하면됩니다.

$ echo "http%3A%2F%2Fwww" | urldecode http://www 

Bash

스크립팅 할 때 다음 구문을 사용할 수 있습니다.

input="http%3A%2F%2Fwww" decoded=$(printf "%b" "${input//%/\\x}") 

그러나 위 구문은 플러스를 처리하지 않습니다 (+) 올바르게 사용하려면 sed 또는 @isaac 에서 제안한대로 다음 구문을 사용합니다.

decoded=$(input=${input//+/ }; printf "${input//%/\\x}") 

다음 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()는 데이터에 백 슬래시가 없다고 가정합니다.

다음 위치에 유사한 Joel의 버전이 있습니다. https://github.com/sixarm/urldecode.sh


bash + xxd

xxd 도구를 사용한 Bash 함수 :

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 s gist 파일 , 또한 stackoverflow 에 있습니다.


PHP

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를 사용합니다.


Perl

Perl에서 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 

awk

anon 사용해보기 솔루션 :

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

참고 : 매개 변수 -n는 GNU

.

참조 : awk printf를 사용하여 텍스트를 urldecode .

파일 이름 디코딩

파일 이름에서 URL 인코딩을 제거해야하는 경우 renameutils에서 deurlname 도구를 사용하세요. div> (예 : deurlname *.*).

참고 항목 :


관련 :

댓글

  • awk : 라이브러리 함수 chr()를 사용하면 GNU awk (gawk)에서만 작동 할 가능성이 높습니다. 그러나이 경우 POSIX awk에 해당하는 항목이 거의 없습니다. -n 옵션 (10 진수가 아닌 인수 허용) GNU awk 전문 분야입니다.
  • printf와 관련된 솔루션은 다음을 고려하지 않습니다. URL에는 %25와 같이 이스케이프 된 백분율 기호가 포함될 수 있습니다. %%와 같은 다른 백분율 기호를 사용하여 printf를 위해 이스케이프 처리하지 않고이를 printf에 전달합니다.
  • bash 버전에는 local LC_ALL=C 상단에, 그렇지 않으면 모든 와이드 문자 (예 : 일본어, 중국어 등)가 올바르게 바이트로 분할되지 않습니다.
  • github.com/SixArm/ urlencode.sh
  • printf 버전은 BSD 버전의 printf (예 : macOS)를 사용할 때 작동하지 않지만 ‘ GNU Coreutils 버전.

Answer

Python 표준 라이브러리에는이를위한 내장 함수가 있습니다. Python 2에서는 urllib.unquote 입니다.

decoded_url=$(python2 -c "import sys, urllib; print urllib.unquote(sys.argv[1])" "$encoded_url") 

또는 파일 처리 :

python2 -c "import sys, urllib; print urllib.unquote(sys.stdin.read())" <file >file.new && mv -f file.new file 

Python 3에서는 urllib.parse.unquote .

decoded_url=$(python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" "$encoded_url") 

또는 파일 처리 :

python3 -c "import sys, urllib; print(urllib.parse.unquote(sys.stdin.read()))" <file >file.new && mv -f file.new file 

Perl에서는 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 

POSIX 휴대용 도구를 고수하려면 ” 유일하게 심각한 후보가 16 진수를 구문 분석하지 않는 awk이기 때문입니다. BusyBox를 포함하여 일반적인 awk 구현의 예는 awk printf를 사용하여 텍스트 urldecode 를 참조하세요.

Answer

Perl 원 라이너 :

$ perl -pe "s/\%(\w\w)/chr hex $1/ge" 

예 :

$ echo "%21%22" | perl -pe "s/\%(\w\w)/chr hex $1/ge" !" 

댓글

  • 이 답변은 ‘ Perl 모듈 설치를 다루고 싶지 않을 때 매력적입니다.

li>

  • MacOS에서 저에게 잘 맞았던 단 하나입니다.
  • 모든 수준의 URL 인코딩을 한 번에 해결하려면 ‘ 또한 모든 %25xx 중첩 인코딩
  • Answer 디코딩하는 perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);' / h2>

    단순한 sed 명령을 사용하려면 다음을 사용하세요.

    sed -e "s/%21/!/g" -e "s/%23/#/g" -e "s/%24/$/g" -e "s/%26/\&/g" -e "s/%27/"/g" -e "s/%28/(/g" -e "s/%29/)/g" 

    그러나 다음과 같은 스크립트를 만드는 것이 더 편리합니다 (예 : sedscript) :

     s/%21/!/g s/%23/#/g s/%24/$/g s/%26/\&/g s/%27/"/g s/%28/(/g s/%29/)/g  

    그런 다음 sed -f sedscript < old > new를 실행하면 원하는대로 출력됩니다.


    간편하게 urlencode 명령은 gridsite-clients 패키지는 Ubuntu / Debian 시스템의 sudo apt-get install gridsite-clients에서 설치할 수 있습니다.

    NAME

      urlencode-URL 인코딩 형식간에 문자열 변환

    시놉시스

      urlencode [-m|-d] string [string ...]

    DESCRIPTION

      urlencode는 RFC 1738에 따라 문자열을 인코딩합니다.

      즉, AZ az 09 . _-는 수정되지 않은 상태로 전달됩니다. 그러나 다른 모든 문자는 % HH로 표시됩니다. 여기서 HH는 2d입니다. igit 대문자 16 진수 ASCII 표현. 예를 들어 URL http://www.gridpp.ac.uk/http%3A%2F%2Fwww.gridpp.ac.uk%2F

      urlencode가 명령 행에 주어진 모든 문자열의 각 문자. 여러 문자열이 제공되는 경우 변환 전에 구분 된 공백으로 연결됩니다.

    OPTIONS

      -m

        전체 변환 대신 GridSite “mild URL encoding”을 수행합니다. 여기서 AZ az 0-9. =-_ @ 및 /는 수정되지 않은 상태로 전달됩니다. 이로 인해 약간 더 사람이 읽을 수있는 문자열이 생성되지만 애플리케이션은 슬래시로 암시 된 디렉토리를 만들거나 시뮬레이션 할 준비가되어 있어야합니다.

      -d

        URL 디코딩을 수행하십시오. RFC 1738에 따라 인코딩보다. % HH 및 % hh 문자열이 변환되고 다른 문자는 수정되지 않은 상태로 전달됩니다. 단, +는 공백으로 변환됩니다.

    URL 디코딩 예 :

    $ urlencode -d "http%3a%2f%2funix.stackexchange.com%2f" http://unix.stackexchange.com/ $ urlencode -d "Example: %21, %22, . . . , %29 etc" Example: !, ", . . . , ) etc 

    댓글

    • sed에 대한 자습서 방문
    • 모든 문자를 하드 코딩해야하므로 잘못된 솔루션입니다. 이 문제는 자주 사용되는 %20 이스케이프 시퀀스가 누락 된 코드로 예시됩니다.
    • @Overv I ‘ ve just 수정 됨
    • 또한 s/%26/&/g의 기능을 다시 한 번 확인하는 것이 좋습니다. (고쳤습니다.)

    답변

    이 스레드의 우수 답변 , 그래서 여기에 있습니다.

    개인적으로 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])"" 

    두 명령 모두 명령 줄 인수 로 전달 된 데이터를 변환하거나 표준 입력 . 두 한 줄 모두 명령 줄 인수 (빈 항목 포함)가 있는지 확인하고 처리하거나 읽기만하면됩니다. 그렇지 않으면 표준 입력입니다.


    2017-05-23 업데이트 (슬래시 인코딩)

    @Bevor “의 댓글에 대한 응답

    또한 슬래시를 인코딩해야합니다. 인용 함수에 빈 두 번째 인수를 추가하면 슬래시도 인코딩됩니다.

    그래서 마지막으로 urlencode m bash 의> alias 는 다음과 같습니다.

    alias urlencode="python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")"" 

    시험 ple

    $ 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 

    댓글

    • 슬래시를 인코딩하지 않습니다.
    • @Bevor : 예?
    • urlencode에 슬래시 추가 ” Проба пера “-> 결과 : 슬래시가 인코딩되지 않았습니다.
    • @Bevor : 맞습니다. 당신의 의견에 감사드립니다. 또한 귀하의 의견을 반영하도록 답변을 변경하겠습니다.

    답변

    GNU Awk

    #!/usr/bin/awk -fn @include "ord" BEGIN { RS = "%.." } { printf "%s", $0 if (RT != "") { printf "%s", chr("0x" substr(RT, 2)) } } 

    답변

    및 다른 Perl 접근 방식 :

     #!/usr/bin/env perl use URI::Encode; my $uri = URI::Encode->new( { encode_reserved => 0 } ); while (<>) { print $uri->decode($_) }  

    URI::Encode 모듈을 설치해야합니다. 데비안에서는 간단히 실행할 수 있습니다.

    sudo apt-get install liburi-encode-perl 

    그런 다음 다음을 포함하는 테스트 파일에서 위의 스크립트를 실행했습니다.

     http://foo%21asd%23asd%24%26asd%27asd%28asd%29  

    결과는 다음과 같습니다 (스크립트를 foo.pl로 저장했습니다).

     $ ./foo.pl http://foo!asd#asd$&asd"asd(asd)  

    답변

    (대부분 Posix) 셸의 답변 :

    $ input="%21%22" $ printf "`printf "%s\n" "$input" | sed -e "s/+/ /g" -e "s/%\(..\)/\\\\x\1/g"`" !" 

    설명 :

    • -e "s/+/ /g는 공간에서 각 +를 변환합니다 (URL 인코딩 규범에 설명 됨)
    • -e "s/%\(..\)/\\\\x\1/g"\\xXX의 각 %XX를 변환합니다. \ 중 하나는 인용 규칙에 의해 제거됩니다.
    • 내부 printf는 sed에 입력을 전달하기 위해 있습니다. 다른 메커니즘으로 대체 할 수 있습니다.
    • 외부 printf는 \\xXX 시퀀스를 해석하고 결과를 표시합니다.

    편집 :

    %는 항상 URL에서 해석되어야하므로 이 답변을 단순화하는 것이 가능합니다. 또한, @josch 덕분에 역 따옴표 대신 xargs를 사용하는 것이 더 깔끔하다고 생각합니다.

    $ input="%21%22+%25" $ printf "%s\n" "$input" | sed -e "s/+/ /g; s/%/\\x/g" | xargs -0 printf !" % 

    안타깝게도 (@josch가 알아 차린대로) 이러한 솔루션은 Posix에 \x 이스케이프 시퀀스가 정의되어 있지 않기 때문에 Posix를 준수하지 않습니다.

    댓글

    • U & L에 오신 것을 환영합니다. 이 답변과 작동 방식을 설명 할 수있을 것입니다. 일반적으로 답변은 코드 스 니펫이 아닌 자세한 내용이 포함 된 긴 형식을 선호합니다.
    • 이 답변은 ‘ 포괄적이고 이식 가능하며
      div id = “39d6137dd0”>

      perl 또는 python과 같은 더 무거운 외부 프로그램이 필요하지 않습니다. 저에게 잘 맞습니다.

    • 훌륭한 솔루션입니다. 더 짧고 더 스마트 한 기능 : ... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'. -e 옵션은 실제로 여기에서 생략 할 수 있습니다 …
    • @josch 맞습니다. printfdash에 내장되어 있으며 ‘ \x 이스케이프를 인식하지 못합니다. 작동하려면 printf 대신 /usr/bin/printf를 사용할 수 있습니다. 일반적으로 command printf를 사용할 수 있어야하지만 제대로 작동하지 않는 것 같습니다. 내장 기능을 계속 사용합니다.
    • @Jezz는 실제로 \x 이스케이프 지원은 POSIX의 일부가 아닙니다. pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html 테스트 중에 다른 문제를 발견했습니다. 그렇지 않으면 ‘ %%와 같이 입력하기 때문에 .. 정규식을 [a-zA-Z0-9][a-zA-Z0-9]로 바꾸는 것이 좋습니다. % ‘가 실패합니다. 또한 printf에 대한 백분율을 이스케이프하기 위해 끝에 s/%/%%/g를 추가했습니다.

    Answer

    루비를 사용하는 또 다른 솔루션 (승인 된 Python 답변이 저에게 적합하지 않음)

     alias urldecode="ruby -e "require \"cgi\"; puts CGI.unescape(ARGV[0])"" alias urlencode="ruby -e "require \"cgi\"; puts CGI.escape(ARGV[0])""  

     $ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B  

    댓글

    • 루비에만 익숙하고이 문장은 더 작아 보입니다. 또한 ARGF.read로 변경하여 다른 많은 유틸리티와 마찬가지로 파이프 할 수 있습니다.

    답변

    다음은 정확히이를 수행하는 BASH 함수입니다.

    function urldecode() { echo -ne $(echo -n "$1" | sed -E "s/%/\\\\x/g") } 

    댓글

    • 매력처럼 작동
    • + 문자를 다음으로 변환하려는 경우 공백이 있고 프로세스를 생성하지 않는 경우 다음을 사용할 수 있습니다. : "${1//+/ }" && echo -e "${_//%/\\x}"

    Answer

    셸 전용 :

     $ x="a%20%25%e3%81%82";printf "${x//\%/\\x}" a %あ  

    -- 또는 %b-대시로 시작하는 인수가 옵션으로 처리되지 않도록합니다.

    zsh에서 ${x//%/a}는 끝에 a를 추가하지만 ${x//\%/a}%를 .

    답변

    다음은 다른 스크립트의 관련 부분입니다. (나는 뻔뻔하게 다른 답변에서 내 youtube.com 다운로드 스크립트 를 훔쳤습니다) . sed 및 셸을 사용하여 작동하는 urldecode를 구축합니다.

    set \! \" \# \$ \% \& \" \( \) \* \ \+ \, \/ \: \; \= \? \@ \[ \] for c do set "$@" ""$c" "$c"; shift; done curl -s "$url" | sed "s/\\u0026/\&/g;""$( printf "s/%%%X/\\%s/g;" "$@" )" 

    나는 맹세하지 않습니다. -사실은 의심 스럽지만 YouTube는 충분히 처리했습니다.

    답변

    짧은 문자열 (셸은 slowwww) :

    $ str="q+werty%3D%2F%3B" $ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n" q werty=/; 

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다