Замена нескольких пустых строк одной пустой строкой с помощью поиска и замены RegEx - PullRequest
23 голосов
/ 18 декабря 2010

У меня есть файл, который мне нужно переформатировать и удалить «лишние» пустые строки.

Я использую поиск и замену регулярного выражения синтаксиса Perl в UltraEdit, и мне нужно регулярное выражение в поле «Найти что:».

Вот пример файла, который мне нужно переформатировать.

All current text

REPLACE with all the following:


Winter 2011 Class Schedule 

Winter 2011 Class Registration Dates:  Dec. 6, 2010 – Jan. 1, 2011
Winter 2011 Class Session Dates:  Jan. 5 – Feb. 12, 2011

DANCE

Adventures in Ballet & Tap      
3 – 6 years Instructor:  Ann Newby
Tots ages 3 – 6 years old develop a greater sense of rhythm, flexibility and coordination as they explore the basic elements of movement.
Saturdays   9 - 10 a.m.     Jan. 8 – Feb. 12        Six-week fees:   $30 


African Storytelling
3 – 6 years Instructor:  Ann Newby
Tots ages 3 – 6 years old explore storytelling and fables through spoken word, music, movement and visual arts experiences.
Saturdays   10 – 11 a.m.    Jan. 8 – Feb. 12        Six-week fee:   $30


African Dance / Children

Вы заметите, что в некоторых двойных пустых строках есть пробелы или символы табуляции или оба в них.

После выполнения поиска и замены у меня должен быть файл, похожий на этот.

All current text

REPLACE with all the following:

Winter 2011 Class Schedule 

Winter 2011 Class Registration Dates:  Dec. 6, 2010 – Jan. 1, 2011
Winter 2011 Class Session Dates:  Jan. 5 – Feb. 12, 2011

DANCE

Adventures in Ballet & Tap      
3 – 6 years Instructor:  Ann Newby
Tots ages 3 – 6 years old develop a greater sense of rhythm, flexibility and coordination as they explore the basic elements of movement.
Saturdays   9 - 10 a.m.     Jan. 8 – Feb. 12        Six-week fees:   $30 

African Storytelling
3 – 6 years Instructor:  Ann Newby
Tots ages 3 – 6 years old explore storytelling and fables through spoken word, music, movement and visual arts experiences.
Saturdays   10 – 11 a.m.    Jan. 8 – Feb. 12        Six-week fee:   $30

African Dance / Children

Ответы [ 10 ]

30 голосов
/ 18 декабря 2010

Замена

^(\s*\r\n){2,}

С

\r\n

Это то, чем я закончил.

Выбирает только пустые строки, кратные двум или более, и заменяет их одной.

19 голосов
/ 18 декабря 2010

Зависит от окончания строки.Предполагая \ n, замените это:

([ \t]*\n){3,}

на \n\n.

3 голосов
/ 21 января 2014

Для полноты я хочу сослаться здесь на большой пост Удалить / удалить пустые и пустые строки на форумах пользователей UltraEdit, в котором после всех объяснений для новичков содержится решение по сокращению двух или более строк.с пустыми строками (пустыми строками) или пустыми строками (пустыми строками) в одну пустую строку независимо от типа ограничителя строкиПоддержка выражений не ограничена его линейной архитектурой.Механизмы регулярных выражений Perl имеют флаг, который определяет, соответствует ли точка всем символам, кроме символов новой строки, таким как возврат каретки (CR) и перевод строки (LF), или действительно всем символам, включая CR и LF.Это имеет значение, если текстовый файл интерпретируется как большой поток байтов или как последовательность строк для регулярного выражения Perl находит / заменяет.В UltraEdit флаг установлен по умолчанию, чтобы не включать \r (CR) и \n (LF) через точку в строке поиска регулярного выражения.Но это поведение можно легко изменить в UltraEdit, запустив строку регулярного выражения с (?s), которая изменяет значение флага match_not_dot_newline, как указано на форумах пользователей UltraEdit в теме "."в Perl регулярные выражения не включают CRLF?

Регулярное выражение Perl заменяет работу для файлов с

  • возврат каретки + перевод строки (DOS / Windows) или
  • только перевод строки (Unix, Mac OS 10.0 и более поздние версии) или
  • только возврат каретки (Mac OS 9 и предыдущие версии)

как окончание строки с опциональными конечными пробелами и табуляцией в конце абзаца (одна или несколько строк) и с двумя или более строками без (пустая строка) или с пробелами (пустая строка) под абзацем можно выполнить с помощью строки поиска \h*(\r?\n|\r)(?:\h*\1){2,}и \1\1 в качестве замещающей строки.

Объяснение:

\h* соответствует любой горизонтальный пробел символ в соответствии с Unicode 0 илибольше раз .Эта первая часть поискового выражения соответствует горизонтальным пробельным символам в конце строки, таким как горизонтальные табуляции, обычные пробелы, пробелы без пробелов и некоторые другие не часто используемые пробелы.

Использование \s не годится, так как этот класс символов соответствует любому символу пробела, включая символы возврата вертикального пробела и перевода строки.

(\r?\n|\r) ... - это ИЛИ выражение с двумя аргументами в маркирующей группе .Первый аргумент сопоставляет перевод строки при желании с предыдущим возвратом каретки, а второй аргумент - только с возвратом каретки.Таким образом, это выражение соответствует всем трем общим типам окончаний строк полностью корректно.Важно, чтобы остаток поиска и замены всегда соответствовал либо CR + LF (оба вместе) или просто LF или просто CR .

(?:\h*\1) ... является группой без маркировки , которая соответствует 0 или более горизонтальным пробелам и символ новой строки , найденный ранее с обратной ссылкой \1, то есть CR + LF или просто LF или просто CR .Таким образом, эта часть выражения находит пустую или пустую строку.

{2,} ... - это множитель для предыдущего выражения в группе без маркировки, что означает как минимум два раза .Поэтому после конца абзаца должно быть две или более пустых или пустых строки.Только одной пустой или пустой строки под абзацем недостаточно для положительного соответствия поискового выражения.

Заменяющая строка \1\1 дважды ссылается на первый найденный разрыв строки.

Преимущество этого регулярного выражения по сравнению с другими, опубликованными здесь, заключается в том, что тип окончания строки не должен быть известен.Выражение поиска обнаруживает, что найденная и найденная строка заканчивается ссылкой в ​​строке замены.И, вероятно, существующие пробельные пробелы в конце абзаца и пробелы в следующей строке удаляются также с помощью этого регулярного выражения замены, если под абзацем есть две или более пустых или пустых строк.

{2,} можно заменить на+ в строке поиска, если обрезка пробелов в конце абзаца и в следующей пустой или пустой строке также должна выполняться при выполнении этого регулярного выражения Perl replace.Но обратите внимание, что в этом случае замена выполняет замены, которые вообще ничего не меняют, если в конце абзаца нет завершающих пробелов, а следующая строка - пустая строка.

3 голосов
/ 21 января 2014

Попробуйте этот perl oneliner perl -00pe0, если вы хотите редактировать на месте, просто добавьте -i option

3 голосов
/ 21 ноября 2012

В Vim, используя

:%!cat -s

Я считаю, что это самый простой способ удалить лишнюю пустую строку.

3 голосов
/ 18 декабря 2010

Замена

\n\s*\n\s* 

с

\n\n

должен сделать трюк

0 голосов
/ 24 марта 2018

На моей Intellij IDE , что было искать \n\n и заменить его на \n

0 голосов
/ 26 августа 2011

Должен также работать с пробелами в пустых строках

  • Поиск - / \ n ^ \ s * \ n /
  • Заменить - \ n \ n
0 голосов
/ 18 декабря 2010

См. в этой теме о причинах проблемы. Насколько я понимаю, регулярные выражения UltraEdit являются жадными на уровне символов (то есть внутри строки), но не жадными на уровне строки (грубо говоря). У меня нет доступа к UE, но я бы попытался написать регулярное выражение, чтобы оно соответствовало чему-то конкретному после последней пустой строки. Например:

search:   (\r\n[ \t]*){2,}(\S)
replace:  $1$2

Это соответствует и захватывает два или более экземпляра разделителя строк и любой горизонтальный пробел, следующий за ним, но только сохраняет последний. \S должен заставить его продолжать сопоставление, пока он не найдет строку, содержащую хотя бы один непробельный символ.

Я признаю, что не очень уверен в этом решении; Поддержка регулярных выражений в UltraEdit ограничена линейной архитектурой. Если вам нужен редактор, который выполняет регулярные выражения right , и вы не хотите изучать совершенно новый синтаксис регулярных выражений (например, vim), получите EditPadPro .

0 голосов
/ 18 декабря 2010

Я не уверен, что UltraEdit позволяет вам обойтись в области «замены», но если вы не можете использовать новую строку (у меня была эта проблема раньше), но может использовать ссылки захвата это может сработать:

Find    : \s*(\r\n)\s*(\r\n)\s*\r\n
Replace : $1$2

Не тестировался широко, но, похоже, работает с предоставленным вами образцом.

...