如何去除重复的字符?

kri*_*hna 19 command-line text-processing

如果我有一条线:

Thhiisss iisss mmyyy nameeee
Run Code Online (Sandbox Code Playgroud)

我想将其打印为:

This is my name
Run Code Online (Sandbox Code Playgroud)

什么是 unix 命令?

mkc*_*mkc 27

与tr:

echo "Thhiisss iisss mmyyy nameeee" | tr -s 'a-z'
Run Code Online (Sandbox Code Playgroud)

说明:“挤压”重复字符的-s开关tr。如图所示,该开关可以与一系列字符一起使用:ato z。


jim*_*mij 8

一种方式sed:

sed ':X;s/\(.\)\1/\1/g;tX'
Run Code Online (Sandbox Code Playgroud)

甚至更简单:

sed 's/\(.\)\1*/\1/g'
Run Code Online (Sandbox Code Playgroud)

(感谢Costas和Mikeserv的评论)。


mik*_*erv 8

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

LC_ALL=C tr -s '\0-\255' <input
Run Code Online (Sandbox Code Playgroud)

所以...

echo Thhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '\0-\255'
Run Code Online (Sandbox Code Playgroud)

...印刷...

This is my name
Run Code Online (Sandbox Code Playgroud)

您还可以通过按范围引用您的目标来有选择地执行此操作:

echo TThhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '\101-\132'
Run Code Online (Sandbox Code Playgroud)

...或者...

echo TTTThhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '[:upper:]'
Run Code Online (Sandbox Code Playgroud)

...结果是同一件事,并且两者都打印:

Thhiisss iisss mmyyy nameeee
Run Code Online (Sandbox Code Playgroud)

...或使用[:punct:], [:digit:], [:lower:],[:alpha:]或任何你想要的。你也可以否定选择w / -cso ...

echo 'TTTThhiisss     iisss mmyyy nameeee' |
LC_ALL=C tr -cs '[:upper:]'
Run Code Online (Sandbox Code Playgroud)

...印刷...

TTTThis is my name
Run Code Online (Sandbox Code Playgroud)