Quelle est la différence entre `-C` et` -c` dans la commande `tr`?

9

Aujourd'hui, j'ai appris un peu la trcommande.

Mais j'étais coincé à comprendre la différence entre -cet -C.

Sur le manuel, il était écrit:

 -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.

Je comprends pas tout à fait ce que fait set of values in string1de -cmoyenne option.
Je pensais que ce peut traiter chaîne 1 "ab"dans son ensemble et échapper unique aet b.
J'ai donc fait une expérience:

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

Les choses ne correspondaient pas à mes attentes!
Alors, quelle est la différence entre -Cet -caux trcommandes?


Version du logiciel: BSD 2004 sur OSX10.10

Zen
la source
Voir cette discussion: thread.gmane.org/gmane.comp.standards.posix.austin.general/…
Stéphane Chazelas

Réponses:

6

Le manuel POSIX dit ceci:

  • Si l'option -C est spécifiée, les compléments des caractères spécifiés par string1 (l'ensemble de tous les caractères du jeu de caractères actuel, tel que défini par le paramètre actuel de LC_CTYPE, à l'exception de ceux réellement spécifiés dans l'opérande string1) doivent être placés dans le tableau dans l'ordre de classement croissant, tel que défini par le paramètre actuel de LC_COLLATE.

  • Si l'option -c est spécifiée, le complément des valeurs spécifiées par string1 doit être placé dans le tableau dans l'ordre croissant par valeur binaire.

et contient la note suivante

La norme ISO POSIX-2: 1993 avait une option -c qui se comportait de manière similaire à l'option -C, mais ne fournissait pas de fonctionnalité équivalente à l'option -c spécifiée dans POSIX.1-2008. Cela signifiait que la pratique historique de pouvoir spécifier tr -cd \ 000- \ 177 (qui supprimerait tous les octets avec le bit supérieur défini) n'aurait aucun effet parce que, dans la langue C, les octets avec les valeurs octal 200 à octal 377 ne sont pas des personnages.

De cela, il apparaît que l' -coption vous permet de spécifier des valeurs numériques représentant le caractère ASCII au lieu d'utiliser les caractères eux-mêmes.

casey
la source
Euh, je suppose que la mienne était la version BSD 2004 sur OSX.
Zen
Mais toujours curieux de savoir ce que cela set of valuessignifie dans cette première version.
Zen
@Zen voir mon montage
casey
Non, ce n'est pas la même chose sur les BSD. Voir pour plus de détails.
Stéphane Chazelas
3

cette question concerne donc BSD tr, pas 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

Les outils intégrés OSX seront, je crois, les versions BSD.

[faute de frappe, sed / tr]

Lizardx
la source