我需要一个命令来删除所有重复的字母
输入:
this is a message
输出:
this a meg
我尝试过一些命令但没有起作用
echo testsss |sed 's/([a-zA-Z])\1+/\1/g'
echo testsss |tr -s 'a-z'
答案1
假设您不想将空格与其他字符区分开来,则可以使用awk
:
awk -v FS= '{for(i=1;i<=NF;i++){printf "%s",($i in a)?"":$i;a[$i]}; printf "\n"}' <<< 'this is a message'
this ameg
FS
为了捕获组成字符串的每个单个字符,字段分隔符设置为无。
数组a
中填充了每个字符。如果该字符不是数组的一部分,则打印该字符,否则跳过。
答案2
这是使用 Python 有序字典的非常快捷的方法。可能可以做得更好,但这是我脑海中浮现的第一件事,它符合您uniq
对字符串中字符的基本要求,并根据所讨论的示例 - 保留字符的顺序。
#!/usr/bin/env python3
import sys
from collections import OrderedDict
char_map = OrderedDict()
for arg in sys.argv[1:]:
chars = list(arg)
for c in chars:
char_map[c] = True
for uniq_char in char_map.keys():
print(uniq_char)
工作原理如下:
$ ./uniqc.py 'this is a message'
t
h
i
s
a
m
e
g
请注意,它也适用于空格。
答案3
如果您乐意将空格视为要进行重复数据删除的字符(根据接受的答案,您似乎是这样的),那么一个选项是使用distinct
Perl 中的函数List::MoreUtils
:
echo 'this is a message' |
perl -MList::MoreUtils=distinct -F'' -lpe '$_ = join "", distinct @F'
this ameg