コマンドラインでパーセントエンコード(URLエンコード)文字列をエンコードおよびデコードするにはどうすればよいですか?
私はこれを行うことができるソリューションを探しています:
$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük
コマンドラインでパーセントエンコード(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の要旨ファイルもで、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 *.*
)を使用します。
こちらもご覧ください:
関連:
%
、多分あなたは置き換えることができprintf "$c"
てprintf "%c" "$c"
?他の問題は、一部の非ASCII文字がä
一部の言語設定でエンコードされていない(など)export LC_ALL=C
、関数に追加される可能性があることです(関数以外には影響しないはずです)?
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
xxd -p
60文字ごとに追加される改行を削除します。
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 ''
、この改行とヌルのバイトをスキップします。なしIFS=
これは中の文字を置き換えますIFS
と%00
。LC_ALL=C
これがないと、たとえばUTF-8ロケールで置き換えあ
られ%3042
ます。
このスレッドでベストアンサーについてコメントすることはできません。
個人的には、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番目の引数を追加するだけで、スラッシュもエンコードされます。
したがって、最後に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
sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1]
もっと適切だと思います。特にスクリプトでこれを使用し、誤って空の最初の引数を指定した場合。
len(sys.argv) < 2 and sys.stdin.read()[0:-1] or sys.argv[1]
とおりです。 sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1]
つまり、最初の引数が空であっても、コマンドは標準入力からの入力を待たずに、空の引数を処理します。
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], \"\"))"
違いについての詳細はこちら。
%E6ndr%FCk
私には(標準)UTF8のように見えません。それとも単なる例ですか?