我需要从文件中去除非 ASCII 字符。我正在使用命令 -
/usr/xpg4/bin/tr -cd '\0-\177'
<non-ASCII_file.dat
>ASCII_file.dat
虽然它在过去有效,但现在不起作用。现在它正在剥离所有字母表和非 ASCII 字符。 ASCII 文件中保留的唯一字符是 ASCII 集中的数字和特殊字符。
操作系统是Solaris 9。
什么可能导致此问题?八进制范围是否被错误解释?跟我的环境有关系吗?
答案1
字符范围的行为取决于区域设置,即国际化设置。不同的区域设置对字符有不同的顺序。例如,在法语区域设置中(以及大多数有字符的区域设置中â
),â
将在 之后a
和 之前b
。
C 语言环境是一种不特定于语言的语言环境(或者在必须做出选择时特定于美国英语),在该语言环境中,字符是字节,并且它们按字节值排序。
locales区域tr
关心的是LC_CTYPE
定义字符的类型,以及LC_COLLATE
定义字符的顺序。请注意,现在字符的字节数是可变的,因为 utf-8 作为默认字符集变得越来越常见。
可以使用同名的环境变量来指定它们。LC_ALL
然而覆盖它们全部。因此,为了确保获得您想要的行为,您必须取消设置 LC_ALL 并设置您喜欢的行为,或者更简单,只需设置 LC_ALL:
LC_ALL=C tr -cd '\0-\177'
或者:
LC_ALL=C tr -d '\200-\377'
这也适用于 utf-8 数据,因为 utf-8 是 ASCII 的超集,所有非 ASCII 字符的所有字节中都设置了第八位。