
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=%..
注:パラメータは-n
GNUに固有のものですawk
。
努力するスティーブン・チャジェラスurlencodeソリューション:
awk -v RS='&#[0-9]+;' -v ORS= '1;RT{printf("%%%02X", substr(RT,3))}'
望むより:awk printfを使用したテキストURLのデコード。
デコードファイル名
ファイル名からURLエンコーディングを削除する必要がある場合deurlname
(たとえば)のツールを使用してください。renameutils
deurlname *.*
また見なさい:
関連:
答え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
必要に応じて出力されます。
便宜上、次のコマンドを使用します。urlencode
gridsite-clients
ソフトウェアパッケージ(sudo apt-get install gridsite-clients
Ubuntu / Debianシステム)として直接インストールすることもできます。
名前
urlencode - 文字列をURLエンコード形式に変換するか、逆に変換します。
要約
urlencode [-m|-d] string [string ...]
説明する
オプション
urlencode
RFC 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