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


9

今天,我对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"视为一个整体,并且可以逃脱single ab
所以我做了一个实验:

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

事情不符合我的期望!
那么,什么是之间的区别-C,并-ctr指挥?


软件版本:OSX10.10上的BSD 2004


Answers:


6

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字符的数字值,而不是使用字符本身。


哦,我猜是因为我的是OSX上的2004 BSD版本。
2015年

但是仍然对set of values这个早期版本的含义感到好奇。
2015年

@Zen看我的编辑
Casey

不,它们在BSD上并不相同。有关详细信息,请参见此处
斯特凡Chazelas

3

这个问题实际上是关于BSD tr,而不是gnu tr。

BSD tr man:

 -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 man:

   -c, -C, --complement
          use the complement of SET1

我相信OSX内置工具将是BSD版本。

[固定错字,sed / tr]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.