“tr”命令中的“-C”和“-c”有什么区别?

“tr”命令中的“-C”和“-c”有什么区别?

今天我学习了一些关于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"一个整体,并且会转义 singleab
于是我做了一个实验:

⇒  echo "ab_a_b" | tr -C 'ba' 'c'
abcacbc%                                                                                                                                                                             
⇒  echo "ab_a_b" | tr -c 'ba' 'c'
abcacbc%

事情与我的预期不符!那么,指挥和指挥
有什么区别呢?-C-ctr


软件版本: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]

相关内容