URL 인코딩을 디코딩하고 싶습니다.이 작업을 수행하는 내장 도구가 있습니까? 아니면 누구든지 sed
이 작업을 수행 할 코드?
unix.stackexchange.com 과 인터넷에서 약간 검색했지만 디코딩을위한 명령 줄 도구를 찾을 수 없습니다. URL 인코딩입니다.
제가 원하는 것은 txt
파일을 다음과 같이 수정하는 것입니다.
-
%21
는!
-
%23
는#
-
%24
가$
-
%26
는&
-
%27
는"
가됩니다. -
%28
가(
-
%29
는)
가됩니다.
가됩니다.
가됩니다.
이됩니다.
등이됩니다.
댓글
- stackoverflow.com/questions/6250698/ …
답변
원하는 작업을 수행하는 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
)에서만 작동 할 가능성이 높습니다. 그러나이 경우 POSIXawk
에 해당하는 항목이 거의 없습니다.-n
옵션 (10 진수가 아닌 인수 허용) 은 GNUawk
전문 분야입니다. -
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>
%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에 따라 문자열을 인코딩합니다.
즉, A
–Z
a
–z
0
–9
.
_
및 -
는 수정되지 않은 상태로 전달됩니다. 그러나 다른 모든 문자는 % 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 맞습니다.
printf
는 dash
에 내장되어 있으며 ‘ \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=/;
단순한 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에 따라 문자열을 인코딩합니다.즉,
A
–Z
a
–z
0
–9
.
_
및-
는 수정되지 않은 상태로 전달됩니다. 그러나 다른 모든 문자는 % HH로 표시됩니다. 여기서 HH는 2d입니다. igit 대문자 16 진수 ASCII 표현. 예를 들어 URLhttp://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 맞습니다.
printf
는dash
에 내장되어 있으며 ‘\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
를 추가했습니다.
루비를 사용하는 또 다른 솔루션 (승인 된 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}"
셸 전용 :
$ 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=/;