Ich bin verwirrt über die Art und Weise -s
, -t
und -c
Optionen 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 o
in wiederholt wird good
. Die letzte mögliche Änderung anstelle von o
ist d
und 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 -s
Option 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 -c
Option tr
anhand 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
.
-s
Schalter dazu führttr
, dass alle Zeichen vom letzten Argument bis zumtr
(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 .Ihr Verständnis von
-s
ist falsch, es ersetzt das wiederholte Auftreten von Zeichen in Satz 1 in der Eingabe durch ein einzelnes Zeichen. es ändert das Set nicht, z.gibt
Die
-c
Option 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.Ausgänge
quelle
Die anderen Antworten bedeckt
tr
ist-s
,-t
und-c
Optionen , aber der Vollständigkeit halber:Sie haben Probleme, weil Sie das falsche Werkzeug aufgenommen haben.
tr
ist für Charaktertransformationensed
ist für die Stream-Bearbeitung.Da beide
good
undbad
Zeichenfolgen im Stream sind,sed
ist eine bessere Übereinstimmung.echo I am a good boy | <something>
gibt mir die Ausgabe als: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/g
Flag am Ende steht für globales Ersetzen. Auf diese Weise werden alle Vorkommen ersetzt, nicht nur das erste.quelle
Ja. genau!
tr -s
Ersetzt Instanzen wiederholter Zeichen durch ein einzelnes Zeichen.(über Manpage.)
so geht es also:
es konvertiert
good
zubddd
. wiederholte Instanzen sind 3 'd's.Daher werden diese drei Instanzen durch eine einzelne Instanz ersetzt.
das heißt, es macht es bd. :) :)
quelle