URLエンコードのデコード(パーセントエンコード)

URLエンコードをデコードしたいのですが、これを行うための組み込みツールはありますか、または誰かが私に

コード?

unix.stackexchange.com とインターネットで少し検索しましたが、デコード用のコマンドラインツールが見つかりませんでしたurlエンコーディング。

私がやりたいのは、txtファイルをその場で編集して次のようにすることです。

  • %21!
  • %23#
  • %24$
  • &
  • %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 ‘の以下の回答を参照してください。

回答

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の要点ファイル、また stackoverflow にあります。 p>


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

参照: awkprintfを使用してテキストをurldecodeする

ファイル名のデコード

ファイル名からURLエンコーディングを削除する必要がある場合は、renameutilsツールのdeurlnameを使用します。 div>(例: deurlname *.*)。

関連項目:


関連:

コメント

  • awk:これによりライブラリ関数chr()を使用すると、GNU awk(gawk)でのみ機能する可能性が高くなります。ただし、この場合、POSIX awkに相当するものはほとんどありません。これは、-nオプション(10進数以外の引数を許可) IS GNU awkの専門分野。
  • printfを含むソリューションではそれを考慮していません。 URLには、%25のようなエスケープされたパーセント記号が含まれている場合があります。 %%のような別のパーセント記号を使用してprintf用にエスケープせずにこれらをprintfに渡します。
  • bashバージョンにはlocal LC_ALL=C上部にある場合、そうでない場合、すべての幅の広い文字(つまり、日本語、中国語など)が適切にバイトに分割されません。
  • github.com/SixArm/ urlencode.sh
  • printfバージョンは’ BSDバージョンのprintf(macOSなど)を使用している場合は機能しませんが、 GNUCoreutilsバージョン。

回答

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ポータブルツールを使い続けたい場合は、 s厄介なのは、唯一の深刻な候補がawkであり、16進数を解析しないためです。 BusyBoxを含む一般的なawk実装の例については、 awkprintfを使用したテキストのurldecode を参照してください。

回答

Perl 1ライナー:

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

例:

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

コメント

  • この回答は、perlモジュールのインストールに対処したくない場合に魅力的です。’ li>
  • MacOSでエレガントに機能したのは1つだけです。
  • URLエンコーディングのすべてのレベルを一度に解決したい場合は、’ ■また、perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);'は、すべての%25xxネストされたエンコーディングをデコードします

回答

単純な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 ...]

説明

    urlencodeはRFC1738に従って文字列をエンコードします。

    つまり、文字AZ az 09 . _-は変更されずに渡されます。ただし、他のすべての文字は%HHとして表されます。ここで、HHは2つのdです。 igit大文字の16進ASCII表現。たとえば、URL http://www.gridpp.ac.uk/http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencodeに変換されますコマンドラインで指定されたすべての文字列の各文字。複数の文字列が指定されている場合は、変換前にスペースで区切って連結します。

オプション

    -m

      完全に変換する代わりに、GridSiteの「マイルドURLエンコード」を実行します。ここで、AZ az0-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 ‘改訂
  • また、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のコメントへの応答。

また、スラッシュをエンコードする必要があります。quote関数に空の2番目の引数を追加するだけで、スラッシュもエンコードされます。

つまり、最後にurlencode bash のエイリアスは次のようになります:

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モジュールをインストールする必要があります。私のDebianでは、単純に実行できます

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-encodeノルムで説明されています)
  • -e "s/%\(..\)/\\\\x\1/g" \\xXXの各%XXを変換します。 \の1つがルールを引用することで削除されることに注意してください。
  • 内側のprintfは、sedに入力を渡すためだけにあります。他のメカニズムに置き換える場合があります
  • 外部のprintfは\\xXXシーケンスを解釈し、結果を表示します。

編集:

%は常にURLで解釈される必要があるため、この答えを単純化することは可能です。さらに、 backquotes の代わりにxargsを使用する方がクリーンだと思います(@joschに感謝します)。

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

残念ながら、(@ joschが気付いたように)\xエスケープシーケンスがPosixで定義されていないため、これらのソリューションはいずれもPosixに準拠していません。

コメント

  • U & Lへようこそ。おそらく、あなたはこの答えとそれがどのように機能するかを説明することができます。通常、回答はコードスニペットだけでなく、詳細を含む長い形式にすることをお勧めします。
  • この回答は包括的で移植性があり、’なので、とても気に入っています。’ 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]に置き換えると、’ %%のように入力することができます。 %’は失敗します。また、最後にs/%/%%/gを追加して、printfのパーセンテージをエスケープするようにしました。

回答

ルビーを使用した別の解決策(受け入れられた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を十分に処理しました。

回答

short 文字列(シェルは遅いwww):

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です