Bagaimana opsi '-s', '-t', dan '-c' dari perintah tr bekerja di Unix?

12

Saya bingung mengenai jalan -s, -tdan -cpilihan bekerja di tr perintah. Kapan saya melakukannya

echo I am a good boy | tr good bad

Saya mendapatkan output:

I am a bddd bdy

Ini cukup dimengerti, karena odiulangi dalam good. Perubahan terakhir yang mungkin terjadi oadalah d, dan karenanya output.

Sekarang ketika saya melakukannya

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

outputnya adalah

I am a bd bdy

The -sopsi seharusnya memeras setiap kejadian berulang setiap karakter dalam set 1 ke dalam kejadian tunggal dan kemudian mengubah masing-masing karakter di set 1 ke dalam sesuai karakter di set 2 yang di posisi yang sama.

Jadi seharusnya begitu

I am a bad bay.

Kenapa harus berubah?

Apalagi ketika saya melakukannya

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

saya mendapat dddddddgoodddodd

Bagaimana cara -ckerja opsi tr, merujuk pada contoh ini?

Dan akhirnya: bagaimana mengubah diri saya dari anak baik ke anak jahat .... :): P Yaitu,

echo I am a good boy | tr <something>memberi saya output sebagai: I am a bad boy.

dig_123
sumber

Jawaban:

12

-s Switch: Squeeze (hapus karakter yang diulang)

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

keluaran: i am a bd bdy

Ada dua hal yang terjadi di balik layar yang membuat ini terjadi. Pertama, jika argumen kedua ke trlebih pendek dari yang pertama maka karakter terakhir di argumen ke -2 diulang untuk membuatnya sama panjang dengan yang pertama. Jadi perintah yang setara adalah:

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

Hal lain yang terjadi adalah ketika karakter dalam argumen pertama diulang mereka menimpa kejadian sebelumnya (saya mengacu pada dua oos di good). Ini membuat perintah sekarang setara dengan:

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

(yang kedua ountuk dpenggantian menimpa yang sebelumnya ountuk apenggantian, menjadikannya berlebihan)

Tanpa -ssaklar, hasilnya akan menjadi

i am a bddd bdy

Dengan -ssakelar tr'remas' setiap karakter yang diulang yang tercantum dalam argumen terakhir meninggalkan hasil akhir:

i am a bd bdy

-c Switch: Komplemen

The -cswitch digunakan untuk mencocokkan komplemen dari argumen pertama (yaitu semua karakter tidak tercantum dalam arg 1). Akibatnya, arg 1 akan berisi banyak huruf (256-3). Sekarang, hal yang sama terjadi pada arg 2 seperti pada kasus sebelumnya: Karakter akhir Arg 2 diulang untuk mencocokkan panjang atau Arg 1. Jadi pernyataan aslinya:

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

setara dengan:

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

(perhatikan yang hilang g, odan ddi set pertama, juga catatan yang dakan menggantikan setiap karakter lain di set kedua - termasuk karakter spasi)

Inilah sebabnya mengapa i am a good boyberubah menjadidddddddgoodddodd

Info lebih lanjut di sini: http://www.linuxjournal.com/article/2563

ltn100
sumber
Secara umum benar, kecuali bahwa -ssaklar menyebabkan trmemeras karakter dari argumen terakhir ke tr(bukan yang pertama, seperti yang Anda katakan) yang diulang dalam input. Ini dicatat dalam artikel yang Anda tautkan, dan dijelaskan di paragraf terakhir di bagian "Deskripsi" halaman manual .
ravron
4

Pemahaman Anda tentang -situ tidak benar, itu menggantikan kemunculan berulang karakter di set 1 di input dengan satu karakter. itu tidak mengubah set, misalnya.

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

memberi

i am a bad bay

The -cMenggantikan pilihan set 1 dengan pelengkap (yaitu. Himpunan semua karakter yang tidak terdapat dalam set 1). Anda dapat menggunakan ini untuk menghapus semua kecuali karakter yang ditentukan misalnya.

echo i am a good boy | tr -cd gobdy

output

goodboy
Hasturkun
sumber
: Saya mengerti maksud opsi -s, tetapi pertanyaan saya adalah, bagaimana: gema saya anak yang baik | tr -s bad baik adalah memberikan output sebagai: saya seorang bd bdy ini hanya mungkin ketika ini terjadi: pertama saya anak yang baik diubah menjadi saya seorang bddd bdy maka opsi -s mengubah kejadian multiple d's ke single yaitu: saya bdd bdy lalu berubah menjadi saya bd bdy apakah ini yang sebenarnya terjadi? tolong uraikan ini untuk saya, sama dengan opsi -c bagaimana gema saya anak yang baik | tr -cd gobdy memberikan ini: goodboy
1

Jawaban yang lain tertutup tr's -s, -tdan -cpilihan tetapi untuk kelengkapan:

Anda mengalami masalah karena Anda mengambil alat yang salah.

  • tr adalah untuk transformasi karakter
  • sed untuk mengedit aliran.

Karena keduanya gooddan badurutan karakter dalam aliran sedlebih cocok.

echo I am a good boy | <something> memberi saya output sebagai: I am a bad boy

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

The s/..../..../adalah Pengganti. Apa pun yang cocok dengan persamaan reguler pertama akan diganti dengan yang kedua. The /gbendera di akhir adalah untuk penggantian global dengan cara ini semua kejadian akan diganti tidak hanya yang pertama.

$ 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.
Aaron Goldman
sumber
0

Iya. persis!

tr -s menggantikan contoh karakter yang diulang dengan satu karakter.

(melalui halaman manual.)

jadi begini:

dikonversi goodmenjadi bddd. contoh berulang adalah 3 'd's.

jadi itu menggantikan tiga contoh ini dengan satu contoh.

itu membuatnya bd. :)

Rahul Mishra
sumber
2
Kami tidak berharap setiap jawaban menjadi sempurna, tetapi jawaban dengan ejaan, tanda baca, dan tata bahasa yang benar lebih mudah dibaca.
Ashildr