Come funzionano le opzioni '-s', '-t' e '-c' del comando tr in Unix?


12

Sono confuso per quanto riguarda il modo in cui -s, -te -copzioni di lavoro nel TR comando. Quando io faccio

echo I am a good boy | tr good bad

Ottengo l'output:

I am a bddd bdy

Questo è abbastanza comprensibile, poiché osi ripete in good. L'ultima modifica possibile al posto di oè d, e quindi l'output.

Adesso quando lo faccio

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

l'uscita è

I am a bd bdy

Si -ssuppone che l' opzione comprima ogni ricorrenza ripetuta di ciascun personaggio nel set 1 in una singola occorrenza e quindi cambi ogni carattere nel set 1 nel personaggio corrispondente nel set 2 che si trova nella stessa posizione.

Quindi avrebbe dovuto essere

I am a bad bay.

Perché il cambiamento?

Inoltre, quando lo faccio

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

ottengo dddddddgoodddodd

Come funziona l' -copzione tr, facendo riferimento a questo esempio?

E infine: come cambiare me stesso da bravo ragazzo a cattivo ragazzo .... :): P Cioè,

echo I am a good boy | tr <something>mi dà l'uscita come: I am a bad boy.

Risposte:


12

-s Switch: Squeeze (rimuove i caratteri ripetuti)

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

produzione: i am a bd bdy

Ci sono due cose che accadono dietro le quinte che lo fanno accadere. In primo luogo, se il secondo argomento trè più breve del primo, l' ultimo carattere del secondo argomento viene ripetuto per renderlo della stessa lunghezza del primo. Quindi il comando equivalente è:

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

L'altra cosa che sta succedendo è quando i personaggi nel primo argomento si ripetono sovrascrivono qualsiasi occorrenza precedente (mi riferisco ai due oosecondi good). Questo rende il comando ora equivalente a:

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

(il secondo oalla dsostituzione sovrascrive il precedente oalla asostituzione, rendendolo ridondante)

Senza l' -sinterruttore l'uscita sarebbe

i am a bddd bdy

Con i -sinterruttore tr'stringe' i caratteri ripetuti che sono elencati nella ultima argomentazione lasciando l'output finale:

i am a bd bdy

-c Switch: complemento

L' -cinterruttore è usato per abbinare il complemento del primo argomento (cioè tutti i caratteri non elencati in arg 1). Di conseguenza, arg 1 conterrà molte lettere (256-3). Ora, la stessa cosa accade per arg 2 come nel caso precedente: il personaggio finale di Arg 2 viene ripetuto per corrispondere alla lunghezza o Arg 1. Quindi l'affermazione originale:

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

è equivalente a:

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

(nota i dispersi g, oe dnel primo set, nota anche che dsostituiranno tutti gli altri personaggi nel secondo set - incluso il carattere spazio)

Questo è il motivo per cui i am a good boysi trasforma indddddddgoodddodd

Maggiori informazioni qui: http://www.linuxjournal.com/article/2563


Generalmente corretto, tranne per il fatto che l' -sinterruttore provoca la trcompressione di qualsiasi carattere dall'ultimo argomento a tr(non il primo, come dici tu) che si ripete nell'input. Questo è annotato nell'articolo che hai collegato e viene spiegato nell'ultimo paragrafo nella sezione "Descrizione" della pagina man .
Ravron,

4

La tua comprensione di -snon è corretta, sostituisce le ricorrenze ripetute di caratteri nel set 1 nell'input con un singolo carattere. non modifica il set, ad es.

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

i am a bad bay

L' -copzione sostituisce il set 1 con il suo complemento (ovvero il set di tutti i caratteri non contenuto nel set 1). Puoi usarlo per rimuovere tutti tranne i caratteri specificati, ad esempio.

echo i am a good boy | tr -cd gobdy

uscite

goodboy

: Ho avuto il tuo punto in merito all'opzione -s, ma la mia domanda è: come faccio ad essere un bravo ragazzo | tr -s good bad sta dando un output come: sono un bd bdy questo è possibile solo quando questo accade: prima sono un bravo ragazzo è cambiato in sono un bddd bdy, quindi l'opzione -s cambia le occorrenze di più d in single vale a dire: io sono un bddd bdy quindi cambia in io sono un bd bdy è questo che sta realmente accadendo? per favore, scomponi questo per me, lo stesso con l'opzione -c come è l'eco sono un bravo ragazzo | tr -cd ghiozzo che dà questo: goodboy

1

Le altre risposte coperti tr's -s, -te le -copzioni, ma per completezza:

Stai avendo problemi perché hai preso lo strumento sbagliato.

  • tr è per le trasformazioni dei personaggi
  • sed è per l'editing in streaming.

Poiché entrambi goode badsono la sequenza di caratteri nel flusso sedè una corrispondenza migliore.

echo I am a good boy | <something> mi dà l'output come: I am a bad boy

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

Il s/..../..../è sostituto. Qualunque sia la corrispondenza della prima espressione regolare verrà sostituita con la seconda. La /gbandiera alla fine è per la sostituzione globale in questo modo tutte le occorrenze verranno sostituite non solo la prima.

$ 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.

0

sì. Esattamente!

tr -s sostituisce le istanze di caratteri ripetuti con un singolo carattere.

(tramite la pagina man.)

quindi, va così:

si converte goodin bddd. le istanze ripetute sono 3 'd.

quindi sostituisce queste tre istanze con una singola istanza.

cioè lo rende bd. :)


2
Non ci aspettiamo che ogni risposta sia perfetta, ma le risposte con ortografia, punteggiatura e grammatica corrette sono più facili da leggere.
Ashildr,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.