Estou confuso sobre a forma -s
, -t
e -c
opções de trabalho no tr comando. Quando eu faço
echo I am a good boy | tr good bad
Eu recebo a saída:
I am a bddd bdy
Isso é bastante compreensível, pois o
é repetido em good
. A última mudança possível no lugar de o
é d
e, portanto, a saída.
Agora quando eu faço
echo I am a good boy | tr -s good bad
a saída é
I am a bd bdy
A -s
opção deve espremer todas as ocorrências repetidas de cada caractere no conjunto 1 em uma única ocorrência e depois alterar cada caractere no conjunto 1 para o caractere correspondente no conjunto 2, que está na mesma posição.
Então deveria ter sido
I am a bad bay.
Por que a mudança?
Além disso, quando eu faço
echo I am a good boy | tr -c good bad
eu recebo dddddddgoodddodd
Como funciona a -c
opção tr
, referindo-se a este exemplo?
E finalmente: como mudar de um garoto bom para um garoto ruim .... :): P Ou seja,
echo I am a good boy | tr <something>
dá-me a saída como: I am a bad boy
.
-s
opção faztr
com que todos os caracteres do último argumento sejam espremidostr
(não o primeiro, como você diz) que são repetidos na entrada. Isso é observado no artigo que você vinculou e é explicado no último parágrafo na seção "Descrição" da página de manual .Seu entendimento de
-s
está incorreto, ele substitui ocorrências repetidas de caracteres no conjunto 1 na entrada por um único caractere. não modifica o conjunto, por exemplo.dá
A
-c
opção substitui o conjunto 1 pelo seu complemento (ou seja, o conjunto de todos os caracteres não contidos no conjunto 1). Você pode usar isso para remover todos, exceto os caracteres especificados, por exemplo.saídas
fonte
As outras respostas coberto
tr
's-s
,-t
e-c
opções, mas para ser completo:Você está tendo problemas porque pegou a ferramenta errada.
tr
é para transformações de caracteressed
é para edição de stream.Como os dois
good
e abad
sequência de caracteres no fluxosed
são uma correspondência melhor.echo I am a good boy | <something>
dá-me a saída como:I am a bad boy
O
s/..../..../
é substituto. O que corresponder à primeira expressão regular será substituído pela segunda. A/g
bandeira no final é para substituição global, dessa forma, todas as ocorrências serão substituídas e não apenas a primeira.fonte
sim. exatamente!
tr -s
substitui instâncias de caracteres repetidos por um único caractere.(via página de manual.)
então, é assim:
converte
good
parabddd
. instâncias repetidas são 3 'd's.portanto, substitui essas três instâncias por uma única instância.
é isso que torna bd. :)
fonte