2014-06-23 3 views
3

Я ищу решение для превращения файла A в файл B, что требует объединения двух пустых строк в один.Объединить две пустые строки в одну

Файл-A:

// Comment 1 
// Comment 2 

// Comment 3 


// Comment 4 



// Comment 5 

Файл-B:

// Comment 1 
// Comment 2 

// Comment 3 

// Comment 4 

// Comment 5 

С this post, я знаю, как удалить пустые строки, я задаюсь вопросом, как объединить два последовательных пустых строк в одну.

PS: blank означает, что он может быть пустым ИЛИ может быть вкладка или пробел в строке.

+0

Нравится ли вам иметь одну пустую строку между каждой линией, даже если есть три пустые строки подряд. Приведите пример вывода. – Jotne

+0

Я думал, что могу использовать цикл для 2+ ситуаций с пустым линией, поэтому я не спросил об этом. Вы имеете в виду, что есть ответ на 2+ пустые строки? – Daniel

+0

OK Мой ответ делает то, что, как я думал, вам нравится :) – Jotne

ответ

4
sed -r 's/^\s+$//' infile | cat -s > outfile 

sed удаляет пробелы на пустой строке. Опция -s для cat сжимает последовательные пустые строки в одну.

+1

Это работает, спасибо. Можно ли сделать редактирование «на месте»? – Daniel

+1

+1; умная комбинация инструментов, хотя синтаксис является специфичным для GNU 'sed'. Альтернатива, совместимая с POSIX: 'sed 's/^ [[: blank:]] \ {1, \} $ //' файл | cat -s> outfile'. – mklement0

+1

@ Daniel: вам придется использовать стандартную идиому для работы, не имея возможности выполнять обновление на месте: вместо '> outfile' используйте'> /tmp/tmp.$$ && move/tmp/tmp. $$ infile'. – mklement0

0

Это должно работать:

sed 'N;s/^\([[:space:]]*\)\n\([[:space:]]*\)$/\1\2/;P;D' file 
+0

Не работает. :( – Daniel

+1

@ Daniel Я мог бы изучить его, если вы предоставили образец ввода и/или описали проблему. –

4

Вот простое решение с awk:

awk '!NF && !a++; NF {print;a=0}' file 
// Comment 1 
// Comment 2 

// Comment 3 

// Comment 4 

// Comment 5 

NF подсчитывает количество полей; обратите внимание, что строка, состоящая целиком из пробелов и вкладок, также считается пустой строкой.
a Используется для подсчета пустых строк, и если это больше, чем 1, пропустите его.

1

This page может пригодиться. TL; DR следующим образом:

# delete all CONSECUTIVE blank lines from file except the first; also 
# deletes all blank lines from top and end of file (emulates "cat -s") 
sed '/./,/^$/!d'   # method 1, allows 0 blanks at top, 1 at EOF 
sed '/^$/N;/\n$/D'  # method 2, allows 1 blank at top, 0 at EOF 
+1

Это не удается, если есть 'пробелы' и' tabs'. Запрос OPs 'PS: empty также может означать, что может быть вкладку или пробел в строке. ' – Jotne

4

Это может работать для вас (GNU СЭД):

sed '$!N;s/^\s*\n\s*$//;P;D' file 

Это преобразует 2 пустые строки в одну.

Если вы хотите заменить несколько пустых строк в одном:

sed ':a;$!N;s/^\s*\n\s*$//;ta;P;D' file 

Поразмыслив гораздо проще решение:

sed ':a;N;s/\n\s*$//;ta' file 

Какие сдавливает один или несколько пустых строк в одной пустой строкой.

Еще проще решение использует условие диапазона:

sed '/\S/,/^\s*$/!d' file 

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

+0

Не могли бы вы объяснить'! N; 'и'; P; D' part? – Searene

+0

@MarkZar см. [здесь] (http://www.gnu.org/software/sed /manual/sed.html#Other-Commands), но сначала посмотрите мое недавнее редактирование для лучшего решения. – potong

0
awk -v RS='([[:blank:]]*\n){2,}' -v ORS="\n\n" 1 file 

Я надеялся произвести более короткую версию Perl, но Perl не использует регулярные выражения для его разделителя записей.

awk не редактирует на месте.Вам нужно будет это сделать:

awk -v RS='([[:blank:]]*\n){2,}' -v ORS="\n\n" 1 file > tmp && mv tmp file 
+1

Хедз-ап: Требует реализацию 'awk', которая распознает регулярные выражения как разделители записей (не-POSIX), такие как GNU' awk'. Конечный '\ n \ n' на выходе неловко. – mklement0

Смежные вопросы