Yinelenen karakterler nasıl kaldırılır?


18

Eğer bir çizgi yaşıyorsanız:

Thhiisss iisss mmyyy nameeee

Bunu şu şekilde yazdırmak istiyorum:

This is my name

Bunun için unix komutu nedir?


Kopyaların kaynağı ve istenen çıktı hakkında daha fazla bağlam sağlayabilir misiniz? Ya "Mmyyy nameee Jesssssiiieee" iisssse?
Paulo Almeida

Yanıtlar:


24

İle tr:

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

Açıklama: -sşalter tr"sıkar" tekrarlanan karakterler. Gösterildiği gibi, anahtar bir dizi karakterle kullanılabilir: a- z.


2
komut için bazı açıklamalar gelecekteki okuyucular için yararlı olabilir.
Geek

8

GNU sisteminde sed, yerel ayarınız çok baytlı karakterler kullanıyorsa ( jimmij'nin önerdiği gibi ) kullanmanız veya benzemeniz gerekir, çünkü GNU tryalnızca bayt başına bir karaktere başvurabilir. Bir ASCII yerel ayarında, aşağıdaki gibi tüm kopyaları kaldırabilirsiniz tr:

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

Yani...

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

... baskılar ...

This is my name

Ayrıca, aralıklara göre hedeflerinize başvurarak seçici olarak da yapabilirsiniz:

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

...veya...

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

... hangisinin aynı şey olduğu ve her ikisinin de yazdırdığı:

Thhiisss iisss mmyyy nameeee

... veya kullanım [:punct:], [:digit:], [:lower:], [:alpha:]veya ne istiyorsunuz. Ayrıca seçimi w / -cso ...

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

... baskılar ...

TTTThis is my name

7

Şununla tek yön sed:

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

veya daha da basit:

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

( yorumlar için Costas ve mikeserv teşekkürler ).


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

3

Deneyin tr:

echo "Thhiisss iisss mmyyy nameeee" | tr -s 'hismye'
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.