我有以下命令用于将Unicode字符替换为ASCII字符。
sed -i 's/Ã/A/g'
问题是在我的Unix环境中,sed命令无法识别字符Ã
。因此,我想用它的十六进制值替换它。如果我要使用C3
,语法会是什么样子?
我将使用此命令模板来替换其他字符,例如:
sed -i 's/©/ /g'
"sed"命令中可以使用十六进制值。
echo "Ã" | hexdump -C
00000000 c3 83 0a |...|
00000003
好的,这个字符是由两个字节组合成的 "c3 83"。让我们将其替换为单个字节 "A":
echo "Ã" |sed 's/\xc3\x83/A/g'
A
说明:\x表示对于"sed"来说,后面跟着一个十六进制代码。
0a
是什么,那就是来自 echo
命令的 LF
字符。这就是为什么它被忽略了。或者你可以使用 echo -n
命令来不打印 LF
。 - wisbuckyYou can use iconv:
iconv -f utf-8 -t ascii//translit
尝试设置LANG=C
,然后在Unicode范围内运行它:
echo "hi ☠ there ☠" | LANG=C sed "s/[\x80-\xFF]//g"
还有来自ICU的uconv
。
示例:
uconv -x "::NFD; [:非间隔标记:] > ; ::NFC;"
:用于去除重音符号uconv -x "::Latin; ::Latin-ASCII;"
:用于拉丁/ ASCII 音译uconv -x "::Latin; ::Latin-ASCII; ([^\x00-\x7F]) > ;"
:用于拉丁/ ASCII 音译并删除剩余的码点>0x7Fecho "À l'école ☠" | uconv -x "::Latin; ::Latin-ASCII; ([^\x00-\x7F]) > ;"
输出:A l'ecole
LANG=en_US.UTF-8
。 - yellowantphil