URL 인코딩을 해독하고 싶습니다.이 작업을 수행하기위한 기본 제공 도구가 sed있습니까? 아니면 누구나이 작업을 수행 할 코드를 제공 할 수 있습니까?
unix.stackexchange.com 및 인터넷을 통해 조금 검색 했지만 URL 인코딩을 디코딩하는 명령 줄 도구를 찾을 수 없었습니다.
내가하고 싶은 일은 단순히 txt파일을 편집하여 간단히 편집하는 것입니다.
%21된다!%23된다#%24된다$%26된다&%27된다'%28된다(%29된다)
등등.
답변
원하는 Python 행 라이너를 찾았습니다.
$ 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])"'
예
$ urldecode 'q+werty%3D%2F%3B'
q werty=/;
$ urlencode 'q werty=/;'
q+werty%3D%2F%3B
참고 문헌
답변
sed
다음 명령 행을 시도하십시오.
$ sed 's@+@ @g;s@%@\\x@g' file | xargs -0 printf "%b"
또는 다음을 사용하는 다음 대안 echo -e:
$ 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
세게 때리다
스크립팅 할 때 다음 구문을 사용할 수 있습니다.
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()의 데이터에는 백 슬래시가 없다고 가정합니다.
https://github.com/sixarm/urldecode.sh 에서 비슷한 Joel의 버전이 있습니다.
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의 요지 파일 도에서 유래 .
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에서는을 사용할 수 있습니다 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
어 wk
Anon 솔루션을 사용해보십시오 .
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
참고 : 매개 변수 -n는 GNU에만 해당됩니다 awk.
참조 : 텍스트를 URLDECODE하는 AWK printf의 사용 .
파일 이름 디코딩
파일 이름에서 URL 인코딩을 제거해야하는 경우 deurlname도구 renameutils(예 :)를 사용 deurlname *.*하십시오.
또한보십시오:
관련 :
답변
파이썬 표준 라이브러리에는 내장 함수가 있습니다. 파이썬 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
파이썬 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를 사용하여 텍스트를 URL 디코딩하는 방법을 참조하십시오 .
답변
간단한 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패키지 에서 직접 사용할 수 있습니다 ( sudo apt-get install gridsite-clientsUbuntu / Debian 시스템에서).
이름
urlencode-문자열을 URL 인코딩 형식으로 변환
개요
urlencode [-m|-d] string [string ...]기술
urlencodeRFC 1738에 따라 문자열을 인코딩합니다.즉, 자
A–Za–z0–9._와-수정되지 않은 통과하지만, 다른 모든 문자는 HH가 두 자리 대문자 진수 ASCII 표현입니다 % HH로 표시됩니다. 예를 들어 URLhttp://www.gridpp.ac.uk/은http%3A%2F%2Fwww.gridpp.ac.uk%2F
urlencode명령 행에 제공된 모든 문자열에서 각 문자를 변환합니다. 여러 개의 문자열이 제공되면 변환 전에 공백을 분리하여 연결합니다.옵션
-m전체 변환 대신 AZ az 0-9 인 GridSite “mild URL encoding”을 수행하십시오. =-_ @ 및 /는 수정되지 않은 상태로 전달됩니다. 이렇게하면 사람이 읽을 수있는 문자열이 약간 더 많아 지지만 슬래시로 암시 된 디렉토리를 만들거나 시뮬레이션 할 수 있도록 응용 프로그램을 준비해야합니다.
-dRFC 1738에 따라 인코딩 대신 URL 디코딩
+을 수행하십시오. 공백으로 변환 되는 예외를 제외하고 % 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
답변
펄 원 라이너 :
$ perl -pe 's/\%(\w\w)/chr hex $1/ge'
예:
$ echo '%21%22' | perl -pe 's/\%(\w\w)/chr hex $1/ge'
!"
답변
GNU awk
#!/usr/bin/awk -fn
@include "ord"
BEGIN {
RS = "%.."
}
{
printf RT ? $0 chr("0x" substr(RT, 2)) : $0
}
또는
#!/bin/sh
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
답변
이 스레드 에서 가장 좋은 답변에 대해서는 언급 할 수 없으므로 여기에 있습니다.
개인적으로 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의 의견에 대한 답변.
슬래시도 인코딩 해야하는 경우 인용 함수에 빈 두 번째 인수를 추가하면 슬래시도 인코딩됩니다.
따라서 bash의 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