Tr komutunun '-s', '-t' ve '-c' seçenekleri Unix'te nasıl çalışır?


12

Yolu ile ilgili karıştı -s, -tve -cseçenekler çalışmak tr komutu. Ben yaparken

echo I am a good boy | tr good bad

Çıktıyı alıyorum:

I am a bddd bdy

oTekrarlandığı için bu oldukça anlaşılabilir good. Yerine mümkün olan en son değişiklik oIS dve dolayısıyla çıkışı.

Şimdi yaptığımda

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

çıktı

I am a bd bdy

-sSeçenek, tek bir oluşumu içine grubu 1 'de, her karakterin her tekrar oluşumunu sıkmak ve daha sonra aynı pozisyonda set 2 karşılık gelen karakter içine grubu 1' de, her karakterini değiştirmek için gerekiyordu.

Bu yüzden olmalı

I am a bad bay.

Neden değişiklik?

Dahası, yaptığımda

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

alırım dddddddgoodddodd

Bu örneğe bakarak -cseçenek nasıl çalışır tr?

Ve son olarak: kendimi iyi bir çocuktan kötü bir çocuğa nasıl değiştirebilirim .... :): P Bu,

echo I am a good boy | tr <something>Bana olarak çıktıyı verir: I am a bad boy.

Yanıtlar:


12

-s Anahtar: Sıkıştır (tekrarlanan karakterleri kaldır)

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

çıktı: i am a bd bdy

Bunu gerçekleştiren perde arkasında iki şey oluyor. İlk olarak, ikinci argüman birinciden trdaha kısaysa , 2. argümandaki son karakter , birinciyle aynı uzunlukta olması için tekrarlanır. Yani eşdeğer komut:

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

Gerçekleşen diğer şey, ilk argümandaki karakterler tekrarlandığında önceki olayların üzerine yazılır (iki oos'ye atıfta bulunuyorum good). Bu, komutu şimdi şuna eşdeğer kılar:

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

(ikinci oiçin dyerine önceki yazar oiçin ao yedekli hale değiştirme)

-sAnahtar olmadan çıkış

i am a bddd bdy

-sAnahtar ile son çıktıda son argümanda trlistelenen tekrarlanan karakterleri 'sıkıştırır' :

i am a bd bdy

-c Anahtar: Tamamlayıcı

-cAnahtar (arg 1'de yer almayan tüm karakterlerin yani) ilk argüman tamlayanını eşleştirmek için kullanılır. Sonuç olarak, arg 1 çok sayıda harf içerecektir (256-3). Şimdi, önceki durumda olduğu gibi arg 2'ye de aynı şey olur: Arg 2'nin son karakteri uzunluk veya Arg 1 ile eşleşecek şekilde tekrarlanır.

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

şuna eşittir:

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

(eksik not g, ove dilk sette, ayrıca dikkat d- boşluk karakteriyle dahil ikinci sette her karakter değiştirir)

Bu nedenle i am a good boyiçine dönüşlerdddddddgoodddodd

Daha fazla bilgi için: http://www.linuxjournal.com/article/2563


-sAnahtarın girişte yinelenen son argümandan (ilk söylediğin gibi değil) trherhangi bir karakteri sıkmasına neden olması dışında genellikle doğrudur . Bu, bağlantı verdiğiniz makalede belirtilmiştir ve kılavuz sayfasının "Açıklama" bölümündeki son paragrafta açıklanmıştır . tr
ravron

4

Anlayışınız -syanlış, girişteki set 1'deki karakterlerin tekrar tekrarlarını tek bir karakterle değiştiriyor. seti değiştirmez, örn.

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

verir

i am a bad bay

-cOpsiyon cümledeki onun tamamlayıcı olan set 1 (yani. Bütün karakterler kümesi değil kümesi 1 içerdiği). Örneğin, belirtilen karakterler dışındaki tüm karakterleri kaldırmak için bunu kullanabilirsiniz.

echo i am a good boy | tr -cd gobdy

çıktılar

goodboy

: -S seçeneği ile ilgili fikrinizi aldım, ama sorum şu: nasıl: echo ben iyi bir çocukum | tr -s iyi kötü çıktı veriyor: ben bir bd bdy bu sadece bu olduğunda mümkündür: ilk ben iyi bir çocuk ben bir bddd bdy olarak değiştirilir sonra -s seçeneği birden fazla d'nin tek tek oluşumunu değiştirir yani: ben bir bddd bdy sonra ben bir bd bdy olarak değişir bu aslında ne oluyor? lütfen bunu benim için yık, -c seçeneği ile aynı yankı nasıl ben iyi bir çocukum | tr -cd gobdy bunu veren: goodboy

1

Diğer cevaplar kaplı trs' -s, -tve -cseçenekler ancak şeyiyle:

Sorun yaşıyorsun çünkü yanlış aracı aldın.

  • tr karakter dönüşümleri içindir
  • sed akış düzenleme içindir.

Her ikisi de goodve badakıştaki karakter sırası sedolduğundan daha iyi eşleşir.

echo I am a good boy | <something> çıktıyı şu şekilde verir: I am a bad boy

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

s/..../..../Yerine olduğunu. İlk normal ifadeyle eşleşen her şey ikincisi ile değiştirilecektir. Sondaki /gbayrak Global değiştirme içindir, bu şekilde tüm olaylar sadece birincisi değil.

$ 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

Evet. kesinlikle!

tr -s tekrarlanan karakterlerin örneklerini tek bir karakterle değiştirir.

(kılavuz sayfası aracılığıyla.)

yani şöyle gider:

o dönüştürür goodiçin bddd. tekrarlanan örnekler 3 'd'dir.

böylece bu üç örneği tek bir örnekle değiştirir.

bu onu bd yapar. :)


2
Her cevabın mükemmel olmasını beklemiyoruz, ancak doğru yazım, noktalama işaretleri ve dilbilgisi içeren cevapların okunması daha kolay.
Ashildr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.