3

Могу ли я заменить одинаковые строки одной строкой в конце в Notepad++? Например, из:

1st January 2013
//some text1
1st January 2013
//some text2
1st January 2013
//some text3
1st January 2013

чтобы:

//some text1
//some text2
//some text3
1st January 2013

Также возможно ли, если у меня есть все даты от 1 до 30 или 31, заменить их по отдельности при их последнем появлении?

3 ответа3

5

Вы можете использовать это регулярное выражение в диалоге поиска и замены:

^(.*?)$\s+?^(?=.*^\1$)

и заменить ничем.

Вам необходимо проверить параметры "Регулярное выражение" и «. Соответствует новой строке»:

Блокнот ++ Заменить диалог

Regex объяснение:

^ соответствует началу строки

(.*?) соответствует любым символам 0 или более как можно меньше. Соответствующая строка сохраняется из-за скобок и доступна через \1

$ соответствует концу строки

\s+?^ эта часть соответствует всем пробельным символам (переводы строки!) до следующего начала строки ==> Это удаляет новые строки

(?=.*^\1$) это положительное прогнозное утверждение. Это важная часть в этом регулярном выражении, строка сопоставляется (и удаляется) только тогда, когда точно такая же строка следует в другом месте файла.

1

Вы могли бы достичь этого Sublime Text 2 (или любого редактора с полной поддержкой регулярных выражений - НЕ Notepad++, к сожалению) с помощью регулярного поиска и замены.

Найти:

^(([^\n]+\n)*)([^\n]+)\n(([^\n]+\n)*)\3(\n.*)*$

Заменить:

\1\4\3\6

Продолжайте нажимать "заменить", пока повторяющиеся строки не будут удалены из документа. "Заменить все" здесь не сработает (или вам придется нажимать его несколько раз).


Нашел более простое решение, которое работает как для Notepad++, так и для других редакторов. Найти в режиме регулярных выражений и отключить ". Соответствия новой строки":

^(.*)$\s+(?=(^.*$\s+)*\1)

И заменить ничем. Это основано на ответе @ stema ниже, но работает, даже когда совпадающие строки являются подстроками следующих строк:

1st January 2013
//some text1
1st January 2013
//some text2
1st January 2013
//some text3
21st January 2013

Должен правильно вернуться

//some text1
//some text2
1st January 2013
//some text3
21st January 2013
0

Насколько мне известно, сканирование на наличие дублирующих строк невозможно в Notepad++ без каких-либо плагинов, хотя вы можете значительно упростить ручную работу, если дубликаты имеют известный формат. Например, даты, отформатированные как «3 февраля 2012», могут быть легко найдены (и заменены пустыми строками) путем сопоставления с регулярным выражением ^\d+[snrt][tdh] [A-Z][a-z]* 20\d\d$ ,

Поскольку этот ответ хорошо объясняет, плагин TextFX особенно полезен для этих процедур благодаря своей способности временно сортировать строки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .