如果我有一行:
Thhiisss iisss mmyyy nameeee
我想将其打印为:
This is my name
Unix 命令是什么?
答案1
和tr
:
echo "Thhiisss iisss mmyyy nameeee" | tr -s 'a-z'
解释:“挤压”重复字符-s
的开关。tr
如图所示,该开关可与一系列字符一起使用:a
到z
。
答案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'