gpt4 book ai didi

shell - 删除具有非字符值的字节时 tr -c -d 的行为

转载 作者:行者123 更新时间:2023-12-04 20:39:31 25 4
gpt4 key购买 nike

我无法理解 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.html 的“基本原理”部分中的这一段.

The ISO POSIX-2:1993 standard had a -c option that behaved similarly to the -C option, but did not supply functionality equivalent to the -c option specified in POSIX.1-2008. This meant that historical practice of being able to specify tr -cd\000-\177 (which would delete all bytes with the top bit set) would have no effect because, in the C locale, bytes with the values octal 200 to octal 377 are not characters.



不过,我在 CentOS 6.5 系统上的测试似乎显示它确实有效果。
$ export LC_ALL=C
$ export LANG=C
$ locale
LANG=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C
$ printf "\x41\x42\x81\x82" | od -t x1
0000000 41 42 81 82
0000004
$ printf "\x41\x42\x81\x82" | tr -c -d "\000-\1777" | od -t x1
0000000 41 42
0000002

命令 tr -c -d "\000-\1777"确实删除了值 \x81 的字节和 \x82 .为什么我的测试结果与规范中所写的不一致?

最佳答案

由于您使用的是 CentOS,很可能您的 tr命令来自 GNU coreutils包裹。 GNU tr没有(还)区分 -c 的行为和 -C .在 tr 的最新版本中, 两者 -c-C--complement 的等效短选项选项。

根据GNU documentation for tr :

Currently tr fully supports only single-byte characters. Eventually it will support multibyte characters; when it does, the -C option will cause it to complement the set of characters, whereas -c will cause it to complement the set of values. This distinction will matter only when some values are not characters, and this is possible only in locales using multibyte encodings when the input contains encoding errors.



我还发现 POSIX 规范中引用的段落措辞令人困惑,但我同意 Etan Reisner 的解释,即“符合 1993 版规范的实现将被破坏,但较早的实现(历史)和符合 2008 的实现(和更新)规范将起作用”。

无论如何,GNU tr尚未(尚未)实现 2008 POSIX 规范的这一部分(即区分字符和值),因此不能用于测试。

顺便说一句,你有一个多余的 7在您的 tr -c -d "\000-\1777"命令。

关于shell - 删除具有非字符值的字节时 tr -c -d 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29258988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com