Замена нескольких пустых строк одной пустой строкой с помощью RegEx search and replace

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

Я использую синтаксис Perl regular expression search и заменяю функциональность 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:    


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:   


African Dance / Children

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

после запуска поиска и замены I должен быть такой файл.

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:    

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:   

African Dance / Children

10 ответов


замена

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

С

\r\n

это то, что я закончил.

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


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

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

С \n\n.


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

:%!cat -s

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


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


замена

\n\s*\n\s* 

С

\n\n

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


для полноты я хочу сослаться здесь на большой пост удалить / удалить пустые и пустые строки на форумах пользователей UltraEdit, который содержит внизу после всех объяснений для новичков решение для уменьшения двух или более строк ни с чем (пустые строки) или просто пробелов (пустые строки) до одной пустой строки, независимой от типа Терминатора строки.

и несколько слов о том, что Алан Мур написал в ответ:

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

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

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

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

объяснение:

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

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

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

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

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

заменить строку ссылки дважды первый найденный разрыв линии.

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

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


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

Find    : \s*(\r\n)\s*(\r\n)\s*\r\n
Replace : 

Не протестирован, но, кажется, работает на образец.


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

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

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

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


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

  • Поиск - / \n^\s * \n/
  • заменить - \n\n

на Intellij IDE что искать \n\n и заменить на \n