Was ist der Unterschied zwischen "-C" und "-c" im Befehl "tr"?

9

Heute habe ich etwas über das trKommando gelernt .

Aber ich war fest entschlossen, den Unterschied zwischen -cund zu verstehen -C.

Auf dem Handbuch stand:

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

Ich bin nicht ganz verstehen , was tut set of values in string1der -cmittlere Option.
Ich dachte, es könnte String 1 "ab"als Ganzes behandeln und wird Single aund entkommen b.
Also habe ich ein Experiment gemacht:

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

Die Dinge entsprachen nicht meinen Erwartungen!
Also, was ist der Unterschied zwischen -Cund -cim trKommando?


Softwareversion: BSD 2004 unter OSX10.10

Zen
quelle
Siehe diese Diskussion: thread.gmane.org/gmane.comp.standards.posix.austin.general/…
Stéphane Chazelas

Antworten:

6

Das POSIX-Handbuch sagt Folgendes:

  • Wenn die Option -C angegeben ist, werden die Komplemente der durch string1 angegebenen Zeichen (der Satz aller Zeichen im aktuellen Zeichensatz, wie durch die aktuelle Einstellung von LC_CTYPE definiert, mit Ausnahme der tatsächlich im Operanden string1 angegebenen) platziert im Array in aufsteigender Sortierfolge, wie durch die aktuelle Einstellung von LC_COLLATE definiert.

  • Wenn die Option -c angegeben ist, wird das Komplement der durch string1 angegebenen Werte in aufsteigender Reihenfolge nach Binärwert in das Array eingefügt.

und enthält den folgenden Hinweis

Der Standard ISO POSIX-2: 1993 hatte eine Option -c, die sich ähnlich wie die Option -C verhielt, jedoch keine Funktionalität bereitstellte, die der in POSIX.1-2008 angegebenen Option -c entspricht. Dies bedeutete, dass die historische Praxis, tr -cd \ 000- \ 177 angeben zu können (wodurch alle Bytes mit gesetztem obersten Bit gelöscht würden) keine Auswirkung hatte, da im Gebietsschema C Bytes mit den Werten oktal 200 bis oktal 377 vorhanden waren sind keine Zeichen.

Daraus -cergibt sich, dass Sie mit der Option numerische Werte angeben können, die ASCII-Zeichen darstellen, anstatt die Zeichen selbst zu verwenden.

Casey
quelle
Auh, ich denke, weil meine die 2004 BSD-Version unter OSX war.
Zen
Aber immer noch neugierig, was das set of valuesin dieser frühen Version bedeutet.
Zen
@ Zen siehe meine Bearbeitung
Casey
Nein, bei BSDs sind sie nicht gleich. Siehe dort für Details.
Stéphane Chazelas
3

Diese Frage bezieht sich dann eigentlich auf BSD tr, nicht auf 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 Mann:

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

OSX eingebaute Tools werden meiner Meinung nach die BSD-Versionen sein.

[Tippfehler behoben, sed / tr]

Lizardx
quelle