如何删除所有重复的字母?

如何删除所有重复的字母?

我需要一个命令来删除所有重复的字母

输入:

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

如果您乐意将空格视为要进行重复数据删除的字符(根据接受的答案,您似乎是这样的),那么一个选项是使用distinctPerl 中的函数List::MoreUtils

echo 'this is a message' | 
  perl -MList::MoreUtils=distinct -F'' -lpe '$_ = join "", distinct @F'
this ameg

相关内容