Wie funktionieren die Optionen '-s', '-t' und '-c' des Befehls tr unter Unix?

11

Ich bin verwirrt über die Art und Weise -s, -tund -cOptionen funktionieren im Befehl tr . Wenn ich es tue

echo I am a good boy | tr good bad

Ich bekomme die Ausgabe:

I am a bddd bdy

Dies ist durchaus verständlich, da oin wiederholt wird good. Die letzte mögliche Änderung anstelle von oist dund damit die Ausgabe.

Jetzt wenn ich es tue

echo I am a good boy | tr -s good bad

die Ausgabe ist

I am a bd bdy

Die -sOption soll jedes wiederholte Auftreten jedes Zeichens in Satz 1 in ein einzelnes Vorkommen zusammenfassen und dann jedes Zeichen in Satz 1 in das entsprechende Zeichen in Satz 2 ändern, das sich an derselben Position befindet.

So hätte es sein sollen

I am a bad bay.

Warum die Änderung?

Außerdem, wenn ich es tue

echo I am a good boy | tr -c good bad

Ich bekomme dddddddgoodddodd

Wie funktioniert die -cOption tranhand dieses Beispiels?

Und zum Schluss: wie ich mich von einem guten zu einem bösen Jungen verwandeln kann .... :): P Das heißt,

echo I am a good boy | tr <something>gibt mir die Ausgabe als : I am a bad boy.

dig_123
quelle

Antworten:

11

-s Schalter: Drücken (wiederholte Zeichen entfernen)

echo i am a good boy | tr -s good bad

Ausgabe: i am a bd bdy

Hinter den Kulissen passieren zwei Dinge, die dies ermöglichen. Erstens, wenn das zweite Argument zu trkürzer als das erste ist, wird das letzte Zeichen im zweiten Argument wiederholt, um die gleiche Länge wie das erste zu erreichen. Der entsprechende Befehl lautet also:

echo i am a good boy | tr -s good badd

Das andere, was passiert, ist, wenn Zeichen im ersten Argument wiederholt werden, überschreiben sie jedes vorherige Vorkommen (ich beziehe mich auf die beiden oos in good). Dies macht den Befehl jetzt gleichbedeutend mit:

echo i am a good boy | tr -s god bdd

(Die zweite onach dem dErsetzen überschreibt die vorherige onach dem aErsetzen und macht sie überflüssig.)

Ohne den -sSchalter wäre der Ausgang

i am a bddd bdy

Mit dem -sSchalter werden tralle wiederholten Zeichen, die im letzten Argument aufgeführt sind , 'gequetscht' und die endgültige Ausgabe verlassen:

i am a bd bdy

-c Schalter: Ergänzung

Der -cSchalter wird verwendet, um das Komplement des ersten Arguments abzugleichen (dh alle Zeichen, die nicht in Argument 1 aufgeführt sind). Infolgedessen enthält Argument 1 viele Buchstaben (256-3). Nun passiert mit Arg 2 dasselbe wie im vorherigen Fall: Das letzte Zeichen von Arg 2 wird wiederholt, um der Länge oder Arg 1 zu entsprechen. Also die ursprüngliche Aussage:

echo i am a good boy | tr -c good bad

ist äquivalent zu:

echo i am a good boy | tr abcefhijklmnp... baddddddddddd...

( man beachte die fehlende g, ound dim ersten Satz, beachten Sie auch , dass dwird jedes andere Zeichen im zweiten Satz ersetzen - einschließlich der Leerzeichen)

Deshalb i am a good boyverwandelt sich indddddddgoodddodd

Weitere Informationen hier: http://www.linuxjournal.com/article/2563

ltn100
quelle
Im Allgemeinen korrekt, außer dass der -sSchalter dazu führt tr, dass alle Zeichen vom letzten Argument bis zum tr(nicht dem ersten, wie Sie sagen) gequetscht werden, die in der Eingabe wiederholt werden. Dies wird in dem von Ihnen verlinkten Artikel vermerkt und im letzten Absatz im Abschnitt "Beschreibung" der Manpage erläutert .
Ravron
4

Ihr Verständnis von -sist falsch, es ersetzt das wiederholte Auftreten von Zeichen in Satz 1 in der Eingabe durch ein einzelnes Zeichen. es ändert das Set nicht, z.

echo i am a good boy | tr -s god bad

gibt

i am a bad bay

Die -cOption ersetzt Satz 1 durch sein Komplement (dh den Satz aller Zeichen, die nicht in Satz 1 enthalten sind). Sie können dies verwenden, um beispielsweise alle außer den angegebenen Zeichen zu entfernen.

echo i am a good boy | tr -cd gobdy

Ausgänge

goodboy
Hasturkun
quelle
: Ich habe Ihren Standpunkt bezüglich der Option -s verstanden, aber meine Frage ist, wie: echo ich bin ein guter Junge | tr -s gut schlecht gibt Ausgabe aus als: ich bin ein bd bdy dies ist nur möglich, wenn dies passiert: zuerst bin ich ein guter Junge wird geändert in ich bin ein bddd bdy, dann ändert die Option -s das Auftreten mehrerer ds in einfach dh: ich bin ein bddd bdy dann ändere ich mich zu einem bd bdy ist das was tatsächlich passiert? Bitte brechen Sie dies für mich auf, genauso wie die Option -c. Wie ist das Echo? Ich bin ein guter Junge tr-cd gobdy gibt dies: goodboy
1

Die anderen Antworten bedeckt trist -s, -tund -cOptionen , aber der Vollständigkeit halber:

Sie haben Probleme, weil Sie das falsche Werkzeug aufgenommen haben.

  • tr ist für Charaktertransformationen
  • sed ist für die Stream-Bearbeitung.

Da beide goodund badZeichenfolgen im Stream sind, sedist eine bessere Übereinstimmung.

echo I am a good boy | <something> gibt mir die Ausgabe als: I am a bad boy

$ echo I am a good boy | sed s/good/bad/g
I am a bad boy

Das s/..../..../ist Ersatz. Was auch immer mit dem ersten regulären Ausdruck übereinstimmt, wird durch den zweiten ersetzt. Das /gFlag am Ende steht für globales Ersetzen. Auf diese Weise werden alle Vorkommen ersetzt, nicht nur das erste.

$ echo I am a good boy and a good boy is me. | sed s/good/bad/
I am a bad boy and a good boy is me.

$ echo I am a good boy and a good boy is me. | sed s/good/bad/g
I am a bad boy and a bad boy is me.
Aaron Goldman
quelle
0

Ja. genau!

tr -s Ersetzt Instanzen wiederholter Zeichen durch ein einzelnes Zeichen.

(über Manpage.)

so geht es also:

es konvertiert goodzu bddd. wiederholte Instanzen sind 3 'd's.

Daher werden diese drei Instanzen durch eine einzelne Instanz ersetzt.

das heißt, es macht es bd. :) :)

Rahul Mishra
quelle
2
Wir erwarten nicht, dass jede Antwort perfekt ist, aber Antworten mit korrekter Rechtschreibung, Zeichensetzung und Grammatik sind leichter zu lesen.
Ashildr