Awk
在字元串中全域修改和替換 $1 (awk) 或 1 (sed) 值從十進製到十六進制?
是否可以在字元串中全域修改和替換 $1 (awk) 或 \1 (sed) 值從十進製到十六進制?字元串可能包含任何十進制值,需要對其進行修改並替換為等效的十六進制。
awk 範例:
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 進行 subexec 和管道傳輸,但無法將兩者結合起來以得到十進製到十六進制的修改和替換。
預期輸出:
%2FTest%2DTest%2DTest%2DTest%2DTest%2FTest%2FTest%2F
非常感謝您的幫助。
在 GNU
awk
中,R
ecord 分隔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 中編碼。它還將負責轉換
%
為%25
、空間到%20
、&
到%26
等等。還有一個問題是如何處理非 ASCII 字元(上面的字元

)?如果應該將它們轉換為它們的 UTF-8 編碼的 URI 編碼,例如將€
(€, U+20AC,€
) 轉換為%E2%82%AC
(該字元的 UTF-8 編碼的 3 個字節),那麼應該是:perl -MURI::Escape -MHTML::Entities -lpe '$_ = uri_escape_utf8 decode_entities $_'
使用
uri_escape
,您將獲得 ISO8859-1(又名 latin1)編碼,在當今這個時代不太可能是您想要的(並且僅限於最多 的字元ÿ
)。其他解決方案將轉換€
為%20AC
例如這絕對是錯誤的。