文字列の $1(awk) または \1(sed) 値を 10 進数から 16 進数にグローバルに変更して置き換えることはできますか?文字列には10進値を含めることができ、それを変更してそれに対応する16進値に置き換える必要があります。
奇妙な例:
echo "/Test-Test-Test-Test-Test/Test/Test/" | awk '{gsub("&#([0-9]+);", $1, $0); print}'
sed 例:
echo "/Test-Test-Test-Test-Test/Test/Test/" | sed -E 's/&#([0-9]+);/$(printf "%X" \1)/g;'
echo "/Test-Test-Test-Test-Test/Test/Test/" | sed -E 's/&#([0-9]+);/$(echo "obase=16; \1" | bc)/g;'
printf "%X"とbcを使用してサブ実行とパイピングを試みましたが、10進数から16進数の変更と置換のために2つを組み合わせることはできませんでした。
予想出力:
%2FTest%2DTest%2DTest%2DTest%2DTest%2FTest%2FTest%2F
助けてくれてありがとう。
ベストアンサー1
GNUを使用すると、awk
レコードR
区切りS
文字は正規表現にすることができ、一致する内容は次に格納されますRT
。
gawk -v RS='&#[0-9]+;' -v ORS= '1;RT{printf("%%%02X", substr(RT,3))}'
個人的には以下を使用してくださいperl
。
perl -pe 's{&#(\d+);}{sprintf "%%%02X", $1}ge'
また見なさい:
perl -MURI::Escape -MHTML::Entities -lpe '$_ = uri_escape decode_entities $_'
ここに与えられた:
%2FTest-Test-Test-Test-Test%2FTest%2FTest%2F
これは、URIでハイフンをエンコードする必要がないためです。また、space、toなど%
に変換する作業も処理します。%25
%20
&
%26
もう一つの質問は、ASCII以外の文字(上記の文字
)を処理する方法です。 UTF-8でエンコードされたURIエンコーディングに変換する必要がある場合(例:€
(€、U + 20AC、)は(UTF-8でエンコードされた文字の3バイト)€
に変換されます。%E2%82%AC
perl -MURI::Escape -MHTML::Entities -lpe '$_ = uri_escape_utf8 decode_entities $_'
を使用すると、uri_escape
ISO8859-1(latin1とも呼ばれる)エンコーディングが得られますが、今日は必要に応じてエンコードされません(最大文字に制限されていますÿ
)。他の解決策は、例えば絶対€
に%20AC
間違っていると解釈されます。