У меня возникли проблемы с пониманием этого абзаца из раздела «ОБОСНОВАНИЕ» на http://pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.html.
Стандарт ISO POSIX-2:1993 имел параметр -c, который вел себя аналогично параметру -C, но не предоставлял функциональные возможности, эквивалентные параметру -c, указанному в POSIX.1-2008. Это означало, что историческая практика указания tr -cd\000-\177 (которая удалит все байты с установленным старшим битом) не будет иметь никакого эффекта, потому что в локали C байты со значениями от восьмеричных 200 до восьмеричных 377 не являются персонажами.
Однако мой тест на системе 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
. Почему результат моего теста не соответствует тому, что написано в спецификации?