如何删除重复字符?

如何删除重复字符?

如果我有一行:

Thhiisss iisss mmyyy nameeee

我想将其打印为:

This is my name

Unix 命令是什么?

答案1

tr

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

解释:“挤压”重复字符-s的开关。tr如图所示,该开关可与一系列字符一起使用:az

答案2

一种方法是sed

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

甚至更简单:

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

(谢谢科斯塔斯麦克塞夫供评论)。

答案3

sed在 GNU 系统上,如果您的语言环境使用多字节字符,则需要使用或类似的命令(正如吉米建议的那样因为 GNUtr每个字节只能引用一个字符。在 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

答案4

echo "Thhiisss iisss mmyyy nameeee" | grep -o . | uniq | tr -d '\n'

相关内容