首页 > 解决方案 > 使用 Mac 终端将十六进制代码转换为 URL 中的 ASCII 字符

问题描述

我有一个包含许多 URL 的文本文件,但是其中一些包含十六进制代码,例如,%5D等。我想使用终端命令将这些十六进制代码转换为 ASCII 字符。例如,我想要这个: %28%3Dhttps://51.15.54.108/%3Fdir%3DCloud

变成这样:

https://51.15.54.108/?dir=Cloud

我想,一定有一种方法可以使用sed,或者也许. 我也愿意使用 python。提前致谢!awkexiconv

标签: urlterminalhexascii

解决方案


您可以使用以下urlencode()urldecode()功能:

重击

urlencode() {
    # urlencode <string>
    local length="${#1}"
    for (( i = 0; i < length; i++ )); do
        local c="${1:i:1}"
        case $c in
            [a-zA-Z0-9.~_-]) printf "$c" ;;
            *) printf '%%%02X' "'$c" ;;
        esac
    done
}

urldecode() {
    # urldecode <string>

    local url_encoded="${1//+/ }"
    printf '%b' "${url_encoded//%/\\x}"
}

请注意,上面urldecode()假设数据不包含反斜杠。

使用函数创建一个脚本并加载您的文件:

#!/bin/bash

urldecode() {
    # urldecode <string>

    local url_encoded="${1//+/ }"
    printf '%b\n' "${url_encoded//%/\\x}"
}

input="/Users/<name>/urls.txt"
while IFS= read -r line
do
  urldecode $line >> decoded.txt
done < "$input"

或命令行

VAR="https://51.15.54.108/%3Fdir%3DCloud" ; printf -v VAR "%b" "${VAR//\%/\x}" ; echo $VAR

更新:
测试脚本

#!/bin/bash
input="/Users/<name>/urls.txt"
while IFS= read -r line
do
  echo $line
done < "$input"

这应该从您的 URL 文件中输出每一行


推荐阅读