Bagaimana cara menghapus karakter duplikat?


18

Jika saya memiliki garis sebagai:

Thhiisss iisss mmyyy nameeee

Saya ingin mencetak ini sebagai:

This is my name

Apa perintah unix untuk ini?


Bisakah Anda memberikan lebih banyak konteks tentang asal usul duplikasi dan output yang diinginkan? Bagaimana jika "Mmyyy nameee iisss Jesssssiiieee"?
— Paulo Almeida

Jawaban:


24

Dengan tr:

echo "Thhiisss iisss mmyyy nameeee" | tr -s 'a-z'

Penjelasan: -sberalih dari tr"meremas" karakter berulang. Seperti yang ditunjukkan, sakelar dapat digunakan dengan serangkaian karakter: ahingga z.


2
beberapa penjelasan untuk perintah ini mungkin bermanfaat bagi pembaca di masa mendatang.
— Geek

8

Pada sistem GNU Anda harus menggunakan sedatau serupa jika lokal Anda menggunakan karakter multibyte ( seperti yang disarankan jimmij ) karena GNU trhanya dapat mereferensikan karakter per byte. Di lokal ASCII Anda dapat menghapus semua duplikat dengan tr:

LC_ALL=C tr -s '\0-\255' <input

Begitu...

echo Thhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '\0-\255'

... mencetak ...

This is my name

Anda juga dapat melakukannya secara selektif dengan merujuk target Anda berdasarkan rentang:

echo TThhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '\101-\132'

...atau...

echo TTTThhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '[:upper:]'

... yang berfungsi menjadi hal yang sama, dan yang keduanya mencetak:

Thhiisss iisss mmyyy nameeee

... atau penggunaan [:punct:], [:digit:], [:lower:], [:alpha:]atau apa pun yang Anda inginkan. Anda juga dapat meniadakan pilihan -cdengan ...

echo 'TTTThhiisss     iisss mmyyy nameeee' |
LC_ALL=C tr -cs '[:upper:]'

... mencetak ...

TTTThis is my name

7

Satu cara dengan sed:

sed ':X;s/\(.\)\1/\1/g;tX'

atau bahkan lebih sederhana:

sed 's/\(.\)\1*/\1/g'

(Terima kasih Costas dan mikeserv untuk komentar).


sed 's/\(.\)\1\+/\1/g'
— Costas

3

Coba tr:

echo "Thhiisss iisss mmyyy nameeee" | tr -s 'hismye'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.