我需要检查我的字符串变量是否存在扩展的ASCII字符,一个字节,十进制代码128-255。如果有的话,用多个字符十六进制等效替换它,准备好进一步的grep命令等。
示例字符串:“Ørsted\ Salg”,我需要将其转换为“\ xD8rsted \ Salg”。
我知道在Bash 4中使用hastable的方法:
declare -A symbolHashTable=(
["Ø"]="D8"
);
currSearchTerm="Ørsted\ Salg"
for curRow in "${!symbolHashTable[@]}"; do
currSearchTerm=$(echo $currSearchTerm | sed s/$curRow/'\\x'${symbolHashTable[$curRow]}/)
done
,但这似乎对127个案件来说太乏味了。应该有一种方法可以缩短并且可能更快,而无需编写所有符号。
我可以通过以下方式检测字符串中是否包含任何字符:
echo $currSearchTerm | grep -P "[\x80-\xFF]"
我几乎可以肯定有一种方法可以让sed这样做,但我在“替换为”部分的某个地方迷路了。
答案 0 :(得分:1)
您可以使用Perl轻松完成此操作:
#!/bin/bash
original='Ørsted'
replaced=$(perl -pe 's/([\x80-\xFF])/"\\x".unpack "H*", $1/eg' <<< "$original")
echo "The original variable's hex encoding is:"
od -t x1 <<< "$original"
echo "Therefore I converted $original into $replaced"
这是文件和终端为ISO-8859-1时的输出:
The original variable's hex encoding is:
0000000 d8 72 73 74 65 64 0a
0000007
Therefore I converted Ørsted into \xd8rsted
这是文件和终端为UTF-8时的输出:
The original variable's hex encoding is:
0000000 c3 98 72 73 74 65 64 0a
0000010
Therefore I converted Ørsted into \xc3\x98rsted
在这两种情况下,它都按预期工作。