私はawk
いくつかのテキストをURLデコードするために使用しています。
printf
文字列をステートメントにコーディングすると、printf "%s", "\x3D"
正しく出力されます=
。エスケープされた文字列全体を変数として持っている場合も同じです。
ただし、 しかない場合、3D
を追加するにはどうすればよい\x
ので、printf
は印刷されます=
か\x3D
?
busybox awk 1.4.2
とash
シェルを使用しています。
awk でこれを行う方法はわかりませんが、perl では簡単です。
echo "http://example.com/?q=foo%3Dbar" |
perl -pe 's/\+/ /g; s/%([0-9a-f]{2})/chr(hex($1))/eig'
あなたはashを使用していて、Perlは利用できないので、私はあなたが持っていないかもしれないと思いますgawk
。
私の場合、gawk
またはbusybox awkを使用すると、オプションを使用しない限り(この場合、両方--posix
に対して「x3D」を取得します)、2番目の例は最初の例と同じように機能します(両方から「=」を取得します)。
使用する--non-decimal-data
か--traditional
、一緒に使用するgawk
と、「=」が表示されます。
使用しているAWKのバージョン(、、、、awk
busybox-およびバージョン番号)?nawk
gawk
編集:
ゼロを追加することにより、変数の文字列値を数値に強制変換できます。
~/busybox/awk 'BEGIN { string="3D"; pre="0x"; hex=pre string; printf "%c", hex+0}'
GNU awk
#!/usr/bin/awk -fn
@include "ord"
BEGIN {
RS = "%.."
}
{
printf RT ? $0 chr("0x" substr(RT, 2)) : $0
}
または
#!/bin/sh
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
まず、これが古い質問であることは承知していますが、どの回答もうまくいきませんでした (busybox awk に限定されます)。
2 つのオプション。標準入力を解析するには:
awk '{for (y=0;y<127;y++) if (y!=37) gsub(sprintf("%%%02x|%%%02X",y,y), y==38 ? "\\&" : sprintf("%c", y));gsub(/%25/, "%");print}'
コマンド ライン パラメータを取得するには、次のようにします。
awk 'BEGIN {for (y=0;y<127;y++) if (y!=37) gsub(sprintf("%%%02x|%%%02X",y,y), y==38 ? "\\&" : sprintf("%c", y), ARGV[1]);gsub(/%25/, "%", ARGV[1]);print ARGV[1]}' parameter
そうしないと、%253D のような文字列が二重に解析されてしまうため、%25 を最後に実行する必要があります。
y==38 のインライン チェックは、バックスラッシュを使用しない限り、gsub が & を特殊文字として扱うためです。