Ответ 1
Regular-expressions.info имеет страницу Удаление повторяющихся строк из файла
Это в основном сводится к поиску этого oneliner:
^(.*)(\r?\n\1)+$
... И заменив на \1
.
Примечание. Точка не должна соответствовать Newline
Пояснение:
caret будет соответствовать только в начале строки. Таким образом, механизм регулярных выражений будет только пытаться сопоставить остальную часть регулярного выражения. Комбинация dot и просто соответствует целой строке, независимо от его содержимого, если таковое имеется. Скобки хранят согласованную строку в первом обратном направлении.
Далее мы сопоставим разделитель строк. Я помещал вопросительный знак в
\r?\n
, чтобы это регулярное выражение работало с текстовыми файлами Windows (\r\n
) и UNIX (\n
), Таким образом, до этого момента мы сопоставляли строку и следующий разрыв строки.Теперь нам нужно проверить, следует ли за этой комбинацией дубликат этой же строки. Мы делаем это просто с помощью
\1
. Это первая обратная ссылка, в которой содержится строка, которую мы сопоставляли. Обратная ссылка будет соответствовать тому же самому тексту.Если обратная ссылка не подходит, совпадение регулярных выражений и обратная ссылка отбрасываются, а механизм регулярных выражений снова пытается в начале следующей строки. Если backreference удастся, плюс символ в регулярном выражении будет пытаться сопоставить дополнительные копии строки. Наконец, символ доллар заставляет механизм регулярных выражений проверять, соответствует ли текст, согласованный с обратной ссылкой, полной линией. Мы уже знаем, что текст, сопоставляемый с обратной связью, предшествует разрыву строки (согласованному\r?\N). Поэтому мы теперь проверяем, следует ли за ним также разрыв строки или если он находится в конце файла, используя знак доллар.
Весь матч становится
line\nline
(илиline\nline\nline
и т.д.). Поскольку мы выполняем поиск и замену, строка, ее дубликаты и разрыв строки между ними удаляются из файла. Поскольку мы хотим сохранить исходную строку, но не дубликаты, мы используем\1
в качестве заменяющего текста, чтобы вернуть исходную строку.