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。
一种方式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的评论)。
在 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)