Awk

在字元串中全域修改和替換 $1 (awk) 或 1 (sed) 值從十進製到十六進制?

  • January 7, 2022

是否可以在字元串中全域修改和替換 $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

非常感謝您的幫助。

在 GNUawk中,Record 分隔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例如這絕對是錯誤的。

引用自:https://unix.stackexchange.com/questions/685065