在Bash中,如何只将扩展的ASCII字符转换为十六进制代码?

时间:2018-03-21 19:58:26

标签: bash sed replace extended-ascii

我需要检查我的字符串变量是否存在扩展的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这样做,但我在“替换为”部分的某个地方迷路了。

1 个答案:

答案 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

在这两种情况下,它都按预期工作。