-s
Switch:Squeeze (odstranění opakujících se znaků)
echo i am a good boy | tr -s good bad
výstup:
i am a bd bdy
V zákulisí se dějí dvě věci, které to umožňují. Za prvé, pokud je druhý argument na tr
je kratší než první než poslední znak ve 2. argumentu se opakuje, aby měl stejnou délku jako první. Ekvivalentní příkaz je tedy:
echo i am a good boy | tr -s good badd
Další věc, která se děje, je, že když se znaky v prvním argumentu opakují, přepisují jakýkoli předchozí výskyt (mám na mysli dva oo
s v good
). Díky tomu je příkaz nyní ekvivalentní:
echo i am a good boy | tr -s god bdd
(druhý o
až d
nahrazení přepíše předchozí o
na a
výměna, čímž se stává nadbytečným)
Bez -s
přepnout výstup by byl
i am a bddd bdy
S -s
přepínač tr
„zmáčkne“ všechny opakované znaky, které jsou uvedeny v posledním argument opouštějící konečný výstup:
i am a bd bdy
-c
Switch:Complement
-c
přepínač se používá ke shodě doplňku prvního argumentu (tj. všech znaků, které nejsou uvedeny v argumentu 1). Výsledkem je, že arg 1 bude obsahovat mnoho písmen (256-3). Nyní se s argumentem 2 stane totéž jako v předchozím případě:konečný znak Arg 2 se opakuje, aby odpovídal délce nebo Arg 1. Takže původní tvrzení:
echo i am a good boy | tr -c good bad
je ekvivalentní:
echo i am a good boy | tr abcefhijklmnp... baddddddddddd...
(všimněte si chybějícího g
, o
a d
v první sadě si také všimněte, že d
nahradí každý další znak v druhé sadě -- včetně znaku mezery)
To je důvod, proč i am a good boy
změní na dddddddgoodddodd
Více informací zde:http://www.linuxjournal.com/article/2563
Vaše porozumění -s
je nesprávný, nahradí opakované výskyty znaků v sadě 1 na vstupu jediným znakem. nemodifikuje sadu, např.
echo i am a good boy | tr -s god bad
dává
i am a bad bay
-c
volba nahradí sadu 1 jejím doplňkem (tj. množinou všech znaků, které nejsou obsaženy v sadě 1). Můžete to použít například k odstranění všech znaků kromě specifikovaných.
echo i am a good boy | tr -cd gobdy
výstupy
goodboy