在Bash中如何仅将扩展ASCII字符转换为十六进制编码?
嘿,我来帮你搞定这个扩展ASCII字符替换的需求!你需要把字符串里的单字节扩展ASCII(十进制128-255范围)转换成\xXX的十六进制转义形式,方便后续用grep这类命令处理对吧?比如示例里的Ørsted Salg要变成\xD8rsted Salg,用Bash 4的哈希表完全可以实现,甚至还能搞个通用版自动处理所有扩展字符,我给你详细讲讲:
方法一:手动维护哈希表(精准替换指定字符)
如果你只需要替换特定的几个扩展ASCII字符,手动维护哈希表的方式最直接:
#!/bin/bash # 先检查Bash版本,哈希表是Bash 4及以上才支持的特性 if [[ ${BASH_VERSINFO[0]} -lt 4 ]]; then echo "请使用Bash 4或更高版本运行此脚本" exit 1 fi # 定义扩展ASCII字符到对应十六进制值的映射哈希表 declare -A symbolHashTable=( ["Ø"]="D8" ["Ñ"]="D1" ["Ü"]="DC" # 可以根据实际需求添加更多字符的映射 ) # 示例输入字符串 currSearchTerm="Ørsted Salg" # 遍历哈希表,逐个替换目标字符 for target_char in "${!symbolHashTable[@]}"; do hex_code="${symbolHashTable[$target_char]}" # 使用sed完成替换,注意反斜杠需要双重转义(Bash和sed各解析一次) currSearchTerm=$(echo "$currSearchTerm" | sed "s/$target_char/\\\x$hex_code/g") done # 输出转换后的结果 echo "转换后的字符串: $currSearchTerm"
代码说明:
- 首先做了Bash版本检查,避免低版本不支持哈希表的问题;
- 哈希表
symbolHashTable里存的是你需要替换的扩展字符,以及对应的两位十六进制值(和示例保持大写格式); - 循环遍历哈希表的所有键(也就是要替换的字符),用sed把每个字符替换成
\xXX的转义形式; - 运行后示例输入会输出
\xD8rsted Salg,完全符合你的需求。
方法二:自动检测所有扩展ASCII字符(通用版)
如果需要处理所有128-255范围的扩展ASCII字符,不用手动维护哈希表,直接自动检测转换更高效:
#!/bin/bash if [[ ${BASH_VERSINFO[0]} -lt 4 ]]; then echo "请使用Bash 4或更高版本运行此脚本" exit 1 fi # 示例输入字符串 currSearchTerm="Ørsted Salg" # 初始化转换后的字符串 converted_str="" # 逐个遍历原字符串的每个字符 for ((i=0; i<${#currSearchTerm}; i++)); do current_char="${currSearchTerm:i:1}" # 获取当前字符的十进制ASCII值 ascii_dec=$(printf "%d" "'$current_char") # 判断是否属于扩展ASCII范围(128-255) if [[ $ascii_dec -ge 128 && $ascii_dec -le 255 ]]; then # 转换为两位大写十六进制值 hex_upper=$(printf "%02X" "$ascii_dec") # 拼接成转义形式 converted_str+="\\x$hex_upper" else # 非扩展ASCII字符直接保留 converted_str+="$current_char" fi done # 输出结果 echo "转换后的字符串: $converted_str"
代码说明:
- 逐个遍历字符串的每个字符,用
printf "%d" "'$current_char"拿到字符的十进制ASCII值; - 判断值是否在128-255之间,如果是就转成两位大写十六进制,拼接成
\xXX; - 非扩展ASCII字符直接保留,这样不管遇到什么扩展字符都能自动处理,不用手动添加映射。
内容的提问来源于stack exchange,提问作者uldics
相关产品推荐
相关产品推荐

