Qual é a diferença entre `-C` e` -c` no comando `tr`?

9

Hoje eu aprendi um pouco sobre trcomando.

Mas eu estava preso em entender a diferença entre -ce -C.

No manual, dizia:

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

Eu não estou entendo muito bem o que faz set of values in string1da -copção média.
Eu pensei que ele pode tratar string 1 "ab"como um todo e vai escapar sozinho ae b.
Então eu fiz um experimento:

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

As coisas não correspondiam à minha expectativa!
Então, qual é a diferença entre -Ce -cno trcomando?


Versão do software: BSD 2004 no OSX10.10

zen
fonte
Veja essa discussão: thread.gmane.org/gmane.comp.standards.posix.austin.general/...
Stéphane Chazelas

Respostas:

6

O manual do POSIX diz o seguinte:

  • Se a opção -C for especificada, os complementos dos caracteres especificados pela string1 (o conjunto de todos os caracteres no conjunto de caracteres atual, conforme definido pela configuração atual de LC_CTYPE, exceto aqueles realmente especificados no operando string1) devem ser colocados na matriz na sequência de intercalação crescente, conforme definido pela configuração atual de LC_COLLATE.

  • Se a opção -c for especificada, o complemento dos valores especificados pela string1 deve ser colocado na matriz em ordem crescente por valor binário.

e contém a seguinte nota

O padrão ISO POSIX-2: 1993 tinha uma opção -c que se comportava de maneira semelhante à opção -C, mas não fornecia funcionalidade equivalente à opção -c especificada no POSIX.1-2008. Isso significava que a prática histórica de poder especificar tr -cd \ 000- \ 177 (que excluiria todos os bytes com o conjunto de bits superior) não teria efeito porque, no código C, bytes com os valores octal 200 a octal 377 não são caracteres.

A partir disso, parece que a -copção permite especificar valores numéricos que representam caracteres ASCII em vez de usar os próprios caracteres.

Casey
fonte
Auh, acho que porque a minha era a versão BSD de 2004 no OSX.
Zen
Mas ainda curioso sobre o que set of valuessignifica nesta versão inicial.
Zen
@Zen see my edit
casey
Não, eles não são os mesmos nos BSDs. Veja para detalhes.
Stéphane Chazelas
3

esta questão é realmente sobre BSD tr, não 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 construído em ferramentas, acredito que sejam as versões BSD.

[erro de digitação fixo, sed / tr]

Lizardx
fonte