Это похоже на классическое приложение позитивного взгляда, но, к сожалению, Perl не поддерживает это.Фактически, сделать это (сопоставив предыдущий текст символа в строке с полным регулярным выражением, длина которого не определима), я думаю, можно сделать только с классами регулярных выражений .NET.
Однако положительный прогноз поддерживает полныйрегулярные выражения, так что все, что вам нужно сделать, это перевернуть строку, применить положительный прогноз (как сказал unicornaddict):
perl -pe 's/(.)(?=.*?\1)//g'
И повернуть его обратно, потому что без обратного, который будет только дублировать символ наПоследнее место в строке.
MASSIVE EDIT
Я потратил последние полчаса на это, и похоже, что это работает, безреверсивный .
perl -pe 's/\G$1//g while (/(.).*(?=\1)/g)' FILE_NAME
Я не знаю, гордиться или ужасаться.Я в основном делаю положительную петлю, затем подставляю строку с указанным \ G - что заставляет механизм регулярных выражений начинать сопоставление с последнего совпадения (внутренне представленного переменной pos ()).
Стестовый ввод, такой как:
aabbbcbbccbabb
EFAUUUUH
ABCBBBBD
DEEEFEGGH
AABBCC
Выход выглядит следующим образом:
abc
EFAUH
ABCD
DEFGH
ABC
Я думаю это работает ...
Объяснение - Хорошо, если мое объяснение в прошлый раз не было достаточно ясным - взгляд в будущееи остановиться на последнем совпадении дубликатов переменной [в коде вы можете сделать вывод pos ();внутри цикла для проверки] и s / \ G // g удалит его [вам действительно не нужен / g].Таким образом, в цикле подстановка будет продолжаться, пока все такие дубликаты не будут удалены.Конечно, это может быть немного слишком интенсивно для вашего вкуса ... но вы также увидите большинство решений на основе регулярных выражений.Однако метод реверсирования / предпросмотра, вероятно, будет более эффективным, чем этот.