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


100

URLエンコードをデコードしたいのですが、これを行うための組み込みツールはありますか、またはsedこれを行うコードを提供してくれる人はいますか?

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

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

  • %21 になる !
  • %23 になる #
  • %24 になる $
  • %26 になる &
  • %27 になる '
  • %28 になる (
  • %29 になる )

等々。


回答:


107

あなたがしたいことをするこれらのPython oneライナーを見つけました:

$ 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

参照資料


私はこれを非常に遅く知っていますが、インプレース編集でこれを行う方法はありますか?
DisplayName 14年

@DisplayName-新しいQのように聞こえます。私はそれを聞いて、これを参照します。
slm

15
ストリーミング:cat your_lovely_file.csv| python -c "import sys, urllib as ul; [sys.stdout.write(ul.quote_plus(l)) for l in sys.stdin]"
kirill_igum

5
これはPython 2であることに注意してください。pythonデフォルトで3 であるシステムでは、これはエラーになります。に変更pythonするとpython2役立ちます。
イワンコルミチェック

4
の代わりにpython3使用できます。import urllib.parse as ulimport urllib as ul
ibotty

61

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ツールを使用した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の


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です。

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

ファイル名のデコード

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

こちらもご覧ください:


関連する:


1
awk:これはライブラリ関数を使用するため、chr()GNU awk(gawk)でのみ機能する可能性が高くなります。しかし、この場合にはPOSIXのためのほとんどの等価が存在しますawkので、-n(非小数の引数を許可)オプションは、ISのGNU awk専門。
構文エラー

最初のsedコードはxargs: argument line too long、2164行以上のファイルを提供します。
スパラフーク

2
含まれるソリューションでprintfは、URLにのようなエスケープされたパーセント記号が含まれている可能性があることを考慮していません%25。のような別のパーセント記号でprintfにエスケープせずに、これらをprintfに渡し%%ます。
ジョシュ

1
bashバージョンはlocal LC_ALL=C上部に必要です。そうしないと、すべてのワイド文字(つまり、日本語、中国語など)が適切にバイトに分割されません。
フェルノスト


18

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をご覧ください。


10

単純な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、を実行します。これにより、希望どおりに出力されます。


簡単にするために、コマンドurlencodegridsite-clientssudo apt-get install gridsite-clientsUbuntu / Debianシステムで)からインストールできるパッケージで直接利用することもできます。

名前

    urlencode-文字列をURLエンコード形式との間で変換します
あらすじ

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

説明

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

    すなわち、文字A- Z a- z 0- 9 . _-非修飾を通過しているが、他のすべての文字がHHは、それらの2桁の大文字進ASCII表現である%HH、として表されます。たとえば、URL http://www.gridpp.ac.uk/http%3A%2F%2Fwww.gridpp.ac.uk%2F

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

オプション
    -m
      完全な変換の代わりに、AZがaz 0-9であるGridSite "mild URL encoding"を実行します。=-_ @および/は、変更されずにパススルーされます。これにより、人間が読める文字列が少し増えますが、アプリケーションは、スラッシュによって暗示されるディレクトリを作成またはシミュレートする準備をする必要があります。
    -d
      RFC 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

チュートリアルのためのsed 訪問
Pandya

4
すべての文字をハードコーディングする必要があるため、これは悪い解決策です。この問題は、よく使用される%20エスケープシーケンスがコードにないことで実証されています。
Overv 14年

私はちょうど改訂しました@Overv
Pandya

また、何をs/%26/&/g行うかを再確認することもできます。(私はそれを修正しました。)
Gマン

9

Perl one liner:

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

例:

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

1
この答えは、perlモジュールのインストールに対処したくない場合に魅力的です。
シュリダールSarnobat

1
MacOSで私にとってエレガントに機能したのは1つだけです。
Qix


7

このスレッドベストアンサーについてコメントすることはできません。

個人的には、これらのエイリアスを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のコメントへの応答。

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

したがって、最後に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

1
スラッシュをエンコードしません。
ビバー

@Bevor:例?
DIG MBL

urlencodeにスラッシュを追加します "Пробапера"->結果:スラッシュはエンコードされません。
ビバー

1
@Bevor:あなたは正しい。ご意見ありがとうございます。また、あなたのコメントを反映するように回答を変更します。
DIG mbl

4

また、別の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)

3

(主に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'をそれぞれ変換%XX\\xXXます。のいずれかが\引用ルールによって削除されることに注意してください。
  • 内側のprintfは、sedに入力を渡すためだけにあります。他のメカニズムに置き換えることができます
  • 外側のprintfは\\xXXシーケンスを解釈し、結果を表示します。

編集:

以来%、常にURLで解釈されてなければならない、この答えを簡素化することができます。さらに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へようこそ。おそらく、この答えとその仕組みを説明できます。通常、回答はコードスニペットだけでなく、詳細を含む長い形式であることが望ましいです。
slm

包括的で移植性があり、perlやpythonなどのより重い外部プログラムを必要としないため、この回答が本当に気に入っています。私にとってはうまくいきます。
スティーブウィルズ

1
素晴らしい解決策。そして、さらに短いと賢く:... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'-eオプションは、実際にはここでは省略することができます...
にSyntaxError

1
@joschあなたは正しいprintfです、組み込みであり、エスケープをdash認識しません\x/usr/bin/printf代わりにを使用しprintfて機能させることができます。通常、を使用できるはずですが、正常にcommand printf機能していないようです。引き続きビルトインを使用します。
ジェロームプイエラー

1
@Jezzの\xエスケープのサポートはPOSIXの一部ではありません:pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html テスト中に別の問題が見つかりました。そうしないと'%%%'のような入力が失敗するため、..正規表現を置き換える[a-zA-Z0-9][a-zA-Z0-9]ことができます。s/%/%%/g最後にprintfのパーセンテージを確実にエスケープするために追加しました。
ジョシュ

1

シェルのみ:

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

--または%bを追加して、ダッシュで始まる引数がオプションとして扱われないようにします。

zsh ${x//%/a}ではa最後に追加されますが、に${x//\%/a}置き換え%られaます。


1

ここに、以前書いた別のスクリプトからの関連部分を示します(別の回答から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を十分に確実に処理しました。


1

これを正確に行うためのBASH関数を次に示します。

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

チャームのような作品
AbdElraouf Sabri

0

ルビーを使用した別のソリューション(受け入れられた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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.