今天我学习了一些关于tr
命令的知识。
但我一直在理解-c
和之间的区别-C
。
说明书上写着:
-C Complement the set of characters in string1, that is ``-C ab'' includes every character except for `a' and `b'.
-c Same as -C but complement the set of values in string1.
我不太明白选项是什么set of values in string1
意思-c
。
我认为它可能会将字符串 1 视为"ab"
一个整体,并且会转义 singlea
和b
。
于是我做了一个实验:
⇒ echo "ab_a_b" | tr -C 'ba' 'c'
abcacbc%
⇒ echo "ab_a_b" | tr -c 'ba' 'c'
abcacbc%
事情与我的预期不符!那么,指挥和指挥
有什么区别呢?-C
-c
tr
软件版本:OSX10.10 上的 BSD 2004
答案1
POSIX 手册是这样说的:
如果指定了 -C 选项,则应放置 string1 指定的字符的补码(当前字符集中所有字符的集合,由 LC_CTYPE 的当前设置定义,除了 string1 操作数中实际指定的字符之外)按照 LC_COLLATE 的当前设置定义,按升序排序顺序排列在数组中。
如果指定了 -c 选项,则 string1 指定的值的补码应按二进制值升序放置在数组中。
并包含以下注释
ISO POSIX-2:1993 标准有一个 -c 选项,其行为与 -C 选项类似,但不提供与 POSIX.1-2008 中指定的 -c 选项等效的功能。这意味着能够指定 tr -cd\000-\177 (这将删除设置了最高位的所有字节)的历史实践将不起作用,因为在 C 语言环境中,字节的值是八进制 200 到八进制 377不是字符。
由此看来,该-c
选项允许您指定代表 ASCII 字符的数值,而不是使用字符本身。
答案2
这个问题实际上是关于 BSD tr,而不是 gnu tr。
BSD tr 人:
-C Complement the set of characters in string1, that is ``-C ab''
includes every character except for `a' and `b'.
-c Same as -C but complement the set of values in string1.
FreeBSD 8.2 October 13, 2006
GNU tr 人:
-c, -C, --complement
use the complement of SET1
我相信 OSX 内置工具将是 BSD 版本。
[修正拼写错误,sed/tr]