重複する文字を削除する方法は?


18

次のような行がある場合:

Thhiisss iisss mmyyy nameeee

これを次のように印刷したい:

This is my name

このためのUNIXコマンドとは何ですか?


複製の起源と望ましい出力について、もう少しコンテキストを提供できますか?「Mmyyy nameee iisss Jesssssiiieee」としたらどうでしょうか?
パウロアルメイダ

回答:


24

tr

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

説明:「スクイーズ」リピート文字の-s切り替えtr。示されているように、スイッチは次の文字の範囲で使用できます:az


2
コマンドの説明は、将来の読者にとって役立つかもしれません。
オタク

8

GNUシステムでは、jimmijが示唆するようにsedロケールがマルチバイト文字を使用する場合、GNU はバイトごとの文字しか参照できないため、使用するか、類似する必要があります。ASCIIロケールでは、次のようなすべての重複を削除できます。trtr

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

そう...

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

...プリント...

This is my name

範囲ごとにターゲットを参照することにより、選択的に行うこともできます。

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

...または...

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

...同じものであることがわかり、両方とも印刷されます:

Thhiisss iisss mmyyy nameeee

...または使用[:punct:][:digit:][:lower:][:alpha:]またはものは何でもしたいと思います。また、選択を無効にすることもでき-cます...

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

...プリント...

TTTThis is my name

7

1つの方法sed

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

またはさらに簡単:

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

(コメントについては、コスタスmikeservに感謝します)。


sed 's/\(.\)\1\+/\1/g'
コスタ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.