10

私はawkいくつかのテキストをURLデコードするために使用しています。

printf文字列をステートメントにコーディングすると、printf "%s", "\x3D"正しく出力されます=。エスケープされた文字列全体を変数として持っている場合も同じです。

ただし、 しかない場合、3Dを追加するにはどうすればよい\xので、printfは印刷されます=\x3D?

busybox awk 1.4.2ashシェルを使用しています。

4

5 に答える 5

4

awk でこれを行う方法はわかりませんが、perl では簡単です。

echo "http://example.com/?q=foo%3Dbar" | 
    perl -pe 's/\+/ /g; s/%([0-9a-f]{2})/chr(hex($1))/eig'
于 2010-09-16T15:17:34.230 に答える
2

あなたはashを使用していて、Perlは利用できないので、私はあなたが持っていないかもしれないと思いますgawk

私の場合、gawkまたはbusybox awkを使用すると、オプションを使用しない限り(この場合、両方--posixに対して「x3D」を取得します)、2番目の例は最初の例と同じように機能します(両方から「=」を取得します)。

使用する--non-decimal-data--traditional、一緒に使用するgawkと、「=」が表示されます。

使用しているAWKのバージョン(、、、、awkbusybox-およびバージョン番号)?nawkgawk

編集:

ゼロを追加することにより、変数の文字列値を数値に強制変換できます。

~/busybox/awk 'BEGIN { string="3D"; pre="0x"; hex=pre string; printf "%c", hex+0}'
于 2010-09-16T17:58:07.093 に答える
2

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=%..

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

于 2014-05-01T10:47:20.973 に答える
1

まず、これが古い質問であることは承知していますが、どの回答もうまくいきませんでした (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 が & を特殊文字として扱うためです。

于 2017-10-19T12:42:41.577 に答える