В чем разница между `-C` и` -c` в команде `tr`?

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"в целом и избежать одиночного aи b.
Итак, я сделал эксперимент:

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

Вещи не соответствовали моим ожиданиям!
Итак, в чем разница между -Cи -cв trкоманде?


Версия программного обеспечения: BSD 2004 на OSX10.10

Zen
источник
Смотрите это обсуждение: thread.gmane.org/gmane.comp.standards.posix.austin.general/…
Стефан

Ответы:

6

Руководство POSIX говорит это:

  • Если указана опция -C, должны быть помещены дополнения к символам, указанным в string1 (набор всех символов в текущем наборе символов, как определено текущей настройкой LC_CTYPE, за исключением тех, которые фактически указаны в операнде string1) в массиве в порядке возрастания параметров сортировки, как определено текущей настройкой LC_COLLATE.

  • Если указана опция -c, дополнение значений, указанных в string1, должно быть помещено в массив в порядке возрастания двоичного значения.

и содержит следующую заметку

В стандарте ISO POSIX-2: 1993 была опция -c, которая работала аналогично опции -C, но не обеспечивала функциональность, эквивалентную опции -c, указанной в POSIX.1-2008. Это означало, что историческая практика определения tr -cd \ 000- \ 177 (которая удаляла бы все байты с установленным верхним битом) не имела бы никакого эффекта, потому что в локале C байты со значениями от восьмеричного 200 до восьмеричного 377 не персонажи.

Отсюда видно, что -cопция позволяет вам указывать числовые значения, представляющие символ ASCII, вместо использования самих символов.

Casey
источник
О, я думаю, потому что моя была версия BSD 2004 года для OSX.
Дзен
Но все же любопытно, что set of valuesзначит в этой ранней версии.
Дзен
@ Zen см. Мои правки
Кейси,
Нет, они не одинаковы на BSD. Смотрите там для деталей.
Стефан Шазелас
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]

Lizardx
источник