Мне нужна команда, которая стирает все повторяющиеся буквы
Вход:
this is a message
Выход:
this a meg
некоторые команды, которые я пробовал, но выполнил не работает
echo testsss |sed 's/([a-zA-Z])\1+/\1/g'
echo testsss |tr -s 'a-z'
Принятие Вас не хочет отличать пространство от другого символа, Вы могли использовать 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
заполнено каждым символом. Если этот символ не является частью массива, это печатается, иначе пропускается.
Вот очень быстрый подход с Заказанным Словарем 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
Обратите внимание, что это также работает над пробелами.
Если Вы рады рассматривать пространство как символ, который будет дедуплицирован (который Вы, кажется, на основе принятого ответа), затем, одна опция состоит в том, чтобы использовать distinct
функция от Perl List::MoreUtils
:
echo 'this is a message' |
perl -MList::MoreUtils=distinct -F'' -lpe '$_ = join "", distinct @F'
this ameg