Je suis confus quant à la façon -s
, -t
et -c
options de travail dans la tr commande. Quand je fais
echo I am a good boy | tr good bad
J'obtiens la sortie:
I am a bddd bdy
Ceci est tout à fait compréhensible, car o
est répété dans good
. Le dernier changement possible à la place de o
est d
, et donc de la sortie.
Maintenant, quand je fais
echo I am a good boy | tr -s good bad
la sortie est
I am a bd bdy
L' -s
option est censée compresser chaque occurrence répétée de chaque caractère de l'ensemble 1 en une seule occurrence, puis changer chaque caractère de l'ensemble 1 en le caractère correspondant de l'ensemble 2 qui se trouve à la même position.
Il aurait donc dû être
I am a bad bay.
Pourquoi le changement?
De plus, quand je fais
echo I am a good boy | tr -c good bad
Je reçois dddddddgoodddodd
Comment fonctionne l' -c
option tr
, en se référant à cet exemple?
Et enfin: comment me transformer d'un bon garçon en un mauvais garçon .... :): P Autrement dit,
echo I am a good boy | tr <something>
me donne la sortie comme: I am a bad boy
.
-s
commutateur provoque latr
compression de tous les caractères du dernier argument verstr
(pas le premier, comme vous le dites) qui sont répétés dans l'entrée. Ceci est noté dans l'article que vous avez lié et est expliqué dans le dernier paragraphe de la section "Description" de la page de manuel .Votre compréhension de
-s
est incorrecte, elle remplace les occurrences répétées de caractères de l'ensemble 1 dans l'entrée par un seul caractère. il ne modifie pas l'ensemble, par exemple.donne
L'
-c
option remplace l'ensemble 1 par son complément (c'est-à-dire l'ensemble de tous les caractères non contenus dans l'ensemble 1). Vous pouvez l'utiliser pour supprimer tous les caractères sauf les caractères spécifiés par exemple.les sorties
la source
Les autres réponses couvertes
tr
« s-s
,-t
et les-c
options , mais pour être complet:Vous rencontrez des problèmes parce que vous avez pris le mauvais outil.
tr
est pour les transformations de caractèressed
est pour l'édition de flux.Étant donné que les deux
good
etbad
sont une séquence de caractères dans le fluxsed
est une meilleure correspondance.echo I am a good boy | <something>
me donne la sortie comme:I am a bad boy
Le
s/..../..../
est remplaçant. Tout ce qui correspond à la première expression régulière sera remplacé par la seconde. Le/g
drapeau à la fin est pour le remplacement global de cette façon, toutes les occurrences seront remplacées, pas seulement la première.la source
Oui. exactement!
tr -s
remplace les instances de caractères répétés par un seul caractère.(via la page de manuel.)
alors ça va comme ça:
il se convertit
good
enbddd
. les instances répétées sont 3 'd's.il remplace donc ces trois instances par une seule instance.
c'est qu'il fait bd. :)
la source