如何删除重复的字符?


18

如果我有一行:

Thhiisss iisss mmyyy nameeee

我想打印为:

This is my name

unix命令是什么?


您能否提供有关重复来源和所需输出的更多信息?如果“ Mmyyy命名者iisss Jesssssiiieee”怎么办?
Paulo Almeida 2015年

Answers:


24

tr

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

说明:“挤压” -s开关tr重复字符。如图所示,该开关可用于一系列字符:az


2
该命令的一些解释可能对将来的读者有所帮助。
极客

8

在GNU系统上,sed如果您的语言环境使用多字节字符如jimmij建议的那样),则需要使用或类似的名称,因为GNU tr只能在每个字节中引用一个字符。在ASCII语言环境中,您可以删除所有重复的内容,tr例如:

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

一种方式sed

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

甚至更简单:

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

(感谢Costasmikeserv的评论)。


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

3

尝试tr

echo "Thhiisss iisss mmyyy nameeee" | tr -s 'hismye'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.