web-dev-qa-db-ja.com

コマンドラインでパーセントエンコードされた文字列をエンコードおよびデコードするにはどうすればよいですか?

コマンドラインで percent-encoded (URLエンコード)文字列をエンコードおよびデコードするにはどうすればよいですか?

私はこれを行うことができるソリューションを探しています:

$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük
31
ændrük

これらのコマンドはあなたが望むことをします:

python -c "import urllib, sys; print urllib.quote(sys.argv[1])" æ
python -c "import urllib, sys; print urllib.unquote(sys.argv[1])" %C3%A6

スペースを+としてエンコードする場合は、urllib.quoteurllib.quote_plusに置き換えます。

エイリアス ;-)にしたいと思うと思います

34
Stefano Palazzo

シェル

次のコマンドラインを試してください:

$ echo "%C3%A6ndr%C3%BCk" | sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
ændrük

エイリアスとして定義し、シェル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を介してスペースに置き換える必要があります。

次の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()は、データにバックスラッシュが含まれないと想定していることに注意してください。


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


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

使用法:

$ urlencode "ændrük"
C%26ndrC%3Ck
$ urldecode "%C3%A6ndr%C3%BCk"
ændrük

ソース: ruslanspivak


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

sed

sedの使用は、次の方法で実現できます。

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

awk

anon 解決策を試してください:

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

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


ファイル名のデコード

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

こちらもご覧ください:


関連する:

27
kenorb

予約済みのURI文字および非ASCII文字のパーセントエンコード

jq -s -R -r @uri

-s--Slurp)は入力行を配列に読み取り、-s -R--Slurp --raw-input)は入力を単一の文字列に読み取ります。 -r--raw-output)は、JSON文字列リテラルの代わりに文字列の内容を出力します。

すべての文字をパーセントエンコードする

xxd -p|tr -d \\n|sed 's/../%&/g'

tr -d \\nは、60文字ごとにxxd -pによって追加された改行を削除します。

BashのASCII英数字以外のすべての文字をパーセントエンコードします

eu () {
    local LC_ALL=C c
    while IFS= read -r -n1 -d '' c
    do 
        if [[ $c = [[:alnum:]] ]]
        then 
            printf %s "$c"
        else
            printf %%%02x "'$c"
        fi
    done
}

-d ''がなければ、これは改行とnullバイトをスキップします。 IFS=がなければ、これはIFSの文字を%00に置き換えます。 LC_ALL=Cがなければ、これは例えばUTF-8ロケールで%3042に置き換えます。

7
nisetama

純粋なbashソリューションデコードのみ

$ a='%C3%A6ndr%C3%BCk'
$ echo -e "${a//%/\\x}"
ændrük
5
loentar

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

個人的には、これらのエイリアスを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])"'

両方のコマンドを使用して、データを変換し、コマンドライン引数として渡すか、標準入力から読み込むことができます、どちらのワンライナーもコマンドライン引数(空の引数も)があるかどうかをチェックして処理するか、そうでない場合は標準入力を読み取るためです。

2015-07-16更新(空の1番目の引数)

... @muruコメントによると。

2017-05-28の更新(スラッシュエンコーディング)

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

したがって、最終的にurlencodealiasinbashは次のようになります。

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
4
DIG mbl

「パーセントエンコード」文字を含むファイルの名前を変更できるユーティリティrenameutilsを含むパッケージdeurlnameを見つけました。

残念ながら、stdinやコマンドラインオプションをデコードせず、ファイルの名前を変更するだけなので、デコード(名前を変更したファイルの名前)を取得するためにダミーファイルを作成する必要がありますが、bashスクリプトを使用するとプロセスを自動化できます。

どの文字をエンコードするか疑問がある場合でも、エンコード部分に関する情報はありません。非ASCIIのみ?

もっと良いツール/方法があるはずです。

2
enzotib

Stefano ansqer に似ていますが、Python 3にあります:

python -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1]))" æ
python -c "import urllib.parse, sys; print(urllib.parse.unquote(sys.argv[1]))" %C3%A6

スラッシュもエンコードするには:

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

違いに関する詳細情報 こちら

1
Pablo Bianchi

エンコード用のPOSIX Awk関数を次に示します。

function encodeURIComponent(str, j, q) {
  while (y++ < 125) z[sprintf("%c", y)] = y
  while (y = substr(str, ++j, 1))
    q = y ~ /[[:alnum:]_.!~*\47()-]/ ? q y : q sprintf("%%%02X", z[y])
  return q
}

0
Steven Penny