コマンドラインで percent-encoded (URLエンコード)文字列をエンコードおよびデコードするにはどうすればよいですか?
私はこれを行うことができるソリューションを探しています:
$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
æ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.quote
をurllib.quote_plus
に置き換えます。
エイリアス ;-)にしたいと思うと思います
次のコマンドラインを試してください:
$ 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
スクリプトを作成するときは、次の構文を使用できます。
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()は、データにバックスラッシュが含まれないと想定していることに注意してください。
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 にあります。
次のエイリアスを定義してください。
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を使用すると、次のコマンドを試すことができます。
$ 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
sed
の使用は、次の方法で実現できます。
cat file | sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' | xargs echo -e
anon 解決策を試してください:
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
参照: awk printfを使用してテキストをurldecodeする 。
ファイル名からURLエンコードを削除する必要がある場合は、deurlname
からrenameutils
ツールを使用します(例:deurlname *.*
)。
こちらもご覧ください:
関連する:
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
によって追加された改行を削除します。
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
に置き換えます。
純粋なbashソリューションデコードのみ:
$ a='%C3%A6ndr%C3%BCk'
$ echo -e "${a//%/\\x}"
ændrük
このスレッドでのベストアンサー についてコメントすることはできませんので、こちらが私のものです。
個人的には、これらのエイリアスを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])"'
両方のコマンドを使用して、データを変換し、コマンドライン引数として渡すか、標準入力から読み込むことができます、どちらのワンライナーもコマンドライン引数(空の引数も)があるかどうかをチェックして処理するか、そうでない場合は標準入力を読み取るためです。
... @muruコメントによると。
スラッシュもエンコードする必要がある場合は、引用関数に空の2番目の引数を追加するだけで、スラッシュもエンコードされます。
したがって、最終的にurlencode
aliasinbashは次のようになります。
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
「パーセントエンコード」文字を含むファイルの名前を変更できるユーティリティrenameutils
を含むパッケージdeurlname
を見つけました。
残念ながら、stdinやコマンドラインオプションをデコードせず、ファイルの名前を変更するだけなので、デコード(名前を変更したファイルの名前)を取得するためにダミーファイルを作成する必要がありますが、bashスクリプトを使用するとプロセスを自動化できます。
どの文字をエンコードするか疑問がある場合でも、エンコード部分に関する情報はありません。非ASCIIのみ?
もっと良いツール/方法があるはずです。
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], \"\"))"
違いに関する詳細情報 こちら 。
エンコード用の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
}