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

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

URLエンコーディングをデコードしたいです。これを行うための組み込みツールはありますか?それとも誰かがsedこれを行うためのコードを提供できますか?

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

私が望むのは、ファイルを次のように編集するtxtことだけです。

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

など。

答え1

目的のタスクを実行するPython onelinerを見つけてください。

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

引用する

答え2

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@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


バッシュ+xxd

ツールを使用したBash機能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用gistファイル、またスタックオーバーフロー


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

アッ

努力する匿名解決策:

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

注:パラメータは-nGNUに固有のものですawk

努力するスティーブン・チャジェラスurlencodeソリューション:

awk -v RS='&#[0-9]+;' -v ORS= '1;RT{printf("%%%02X", substr(RT,3))}'

望むより:awk printfを使用したテキストURLのデコード

デコードファイル名

ファイル名からURLエンコーディングを削除する必要がある場合deurlname(たとえば)のツールを使用してください。renameutilsdeurlname *.*

また見なさい:


関連:

答え3

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.parse; 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 -pli -MURI::Escape -e '$_ = uri_unescape($_)' file

POSIX移植可能なツールに固執したい場合は厄介です。唯一の深刻な候補は、16進数を解析しないawkだからです。バラよりawk printfを使用したテキストURLのデコードたとえば、一般的な awk 実装には BusyBox が含まれます。

答え4

簡単なコマンドを使用するには、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-clientsソフトウェアパッケージ(sudo apt-get install gridsite-clientsUbuntu / Debianシステム)として直接インストールすることもできます。

名前

    urlencode - 文字列をURLエンコード形式に変換するか、逆に変換します。
要約

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

説明する

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

    つまり、A-Z a文字と - 文字は変更されずに渡されz 0ますが、他のすべての文字は %HH で表されます。ここで、HHは2桁の大文字の16進ASCII表現です。たとえば、URLは次のようになります。9 . _-http://www.gridpp.ac.uk/http%3A%2F%2Fwww.gridpp.ac.uk%2F

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

オプション
    -m
      完全な変換ではありませんが、AZ az 0-9を使用するGridSiteは「適切なURLエンコード」です。 = - _@ と / は未変更の状態で渡されます。これは少し理解しやすい文字列を生成しますが、アプリケーションはスラッシュが暗示するディレクトリを作成またはエミュレートする準備ができている必要があります。
    -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

関連情報