tr 命令不适用于八进制序列

tr 命令不适用于八进制序列

我需要从文件中去除非 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 字符的所有字节中都设置了第八位。

相关内容