LINUX.ORG.RU

Помогите с Sed-ом(маленький вопрос)

 , , ,


0

2

Есть строка нужно удалить из неё сначала все повторяющиеся сочетания букв, а потом и все повтояющиеся буквы.
Например дано: lolxafloluxff
Нужно сначала удалать lol-ы: xafuxff
А потом x,f что-бы осталось au
Есть идеи?

ага, вот еще задачка:
из цифровой последовательности нужно удалить сначала числа, кратные восьми, а потом все четные числа

anonymous
()
Ответ на: комментарий от Psych218

Э нее проблема в том, что я не знаю какие последовательности и символы будут повторяться. Задча очень сложна и не решить? Может sed не лучший инструмент и есть другие варианты? Принимаю любые советы

wrm60184
() автор топика
Ответ на: комментарий от wrm60184

а… Ну тут sed наверное не хватит, хотя я не уверен. Я бы на питоне наверное писал это.

Psych218 ★★★★★
()
Ответ на: комментарий от wrm60184

Задча очень сложна и не решить?

ты даже не представляешь! и даже ТЗ не смог точно сформулировать, например, в строке «lolxafloluxff_ia_lox» нужно удалить «lol» два раза или «lo» три раза?

и вообще, откуда такая задача взялась?

anonymous
()
Ответ на: комментарий от anonymous

в строке «lolxafloluxff_ia_lox» нужно удалить «lol» два раза или «lo» три раза?

Очевидно, что lol т.к. эта последовательность длиннее.

wrm60184
() автор топика

удалить из неё сначала все повторяющиеся сочетания букв, а потом и все повтояющиеся буквы.

Кстати, какой в этом смысл? Если просто удалить все повторяющиеся буквы, то их сочетания тоже удаляться же. Из двух этапов получаем один? Надо просто оставить уникальные буквы. Или опять не так?

В лоб как-то так. Не оптимально (можно не проверять одну букву по несколько раз), но задачу выполнит.

result = []
for c in s:
    if s.count(c) == 1:
        result.append(c)
print(''.join(result))

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 1)

Есть строка нужно удалить из неё сначала все повторяющиеся сочетания букв, а потом и все повтояющиеся буквы.

Твоя задача сводится к тому, чтобы удалть все повторяющиеся буквы.

Kroz ★★★★★
()
Ответ на: комментарий от wrm60184

lolabclolqwelo
если удалить все повторяющиеся символы, останется abcqwe, а мне нужно чтоб осталось abcqwelo

Почему?
А если сначала удалить повторяющуюся последовательность 'lo'?

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от wrm60184

Но ведь в этой строке есть повторяющееся «lo», почему при первом проходе должны удаляться именно «lol» а не «lo»? Каков критерий определения, какая последовательность «считается»?

Psych218 ★★★★★
()
Ответ на: комментарий от Psych218

Сначала наиболее длинная последовательность, далее по убывающей

wrm60184
() автор топика
Ответ на: комментарий от wrm60184

Франкенштейн-говнокод удаляющий повторяющиеся символы:

$ echo "lolabclolqwelo" | awk -vFS="" '{for(i=1;i<=NF;i++)w[$i]++}END{for(i in w) print i,w[i]}' | grep "..1" | sed 's/\(.\).*$/\1/' | sed -e :a -e N -e 's/\n//' -e ta

Франкенштейн - потому, что собран из кусков найденных в и-нете. Но задачу решает.

Kroz ★★★★★
()

Навскидку, можно сделать что-то вроде преобразования Барроуза — Уилера: добавляется знак $ в конец слова, генерируются все возможные сдвиги слова, сортируются в алфавитном порядке. Дальше — поиск соседних строк с повторяющимися вначале буквами. Только sed тут не причем.

iVS ★★★★★
()
Ответ на: комментарий от iVS

Чёт я в ужасе. Лано не важно, вручную сделаю. Всем спасибо!

wrm60184
() автор топика

Не знаю на сколько в общем случае правильно, не уверен. Зато прикольно и коротко.

#!/usr/bin/perl
my $s = 'lolxafloluxff';
push @l, $s=~/(?=(.{$_}))/g for 1..length($s)/2;
map {$s=~s/$_//g if $s=~m/$_.*$_/} reverse @l;
print "$s\n";

liaonau
()
Последнее исправление: liaonau (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.