Подтвердить что ты не робот

Как использовать sed для удаления только двух пустых строк?

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

Я знаю немного sed, но предлагаемая команда для удаления трех пустых строк над моей головой:

sed '1N;N;/^\n\n$/d;P;D'

4b9b3361

Ответ 1

Я прокомментировал команду sed, которую вы не понимаете:

sed '
    ## In first line: append second line with a newline character between them.
    1N;
    ## Do the same with third line.
    N;
    ## When found three consecutive blank lines, delete them. 
    ## Here there are two newlines but you have to count one more deleted with last "D" command.
    /^\n\n$/d;
    ## The combo "P+D+N" simulates a FIFO, "P+D" prints and deletes from one side while "N" appends
    ## a line from the other side.
    P;
    D
'

Удалите 1N, потому что нам нужно только две строки в "стеке" и достаточно со вторым N и изменить /^\n\n$/d; на /^\n$/d;, чтобы удалить все две последовательные пустые строки.

Тест:

Содержимое infile:

1


2
3

4



5

6


7

Запустите команду sed:

sed '
    N;
    /^\n$/d;
    P;
    D
' infile

Это дает:

1
2
3

4

5

6
7

Ответ 2

Это было бы проще с cat:

cat -s

Ответ 3

Это было бы проще с awk:

awk -v RS='\n\n\n' 1

Ответ 4

sed '/^$/{N;/^\n$/d;}'

Он удалит только две последовательные пустые строки в файле. Вы можете использовать это выражение только в файле, а только вы можете полностью понять. Когда появится пустая строка, она войдет в фигурные скобки.

Обычно sed будет читать одну строку. N добавит вторую строку в пространство шаблонов. Если эта строка - пустая строка. обе строки разделены символом новой строки.

/^\n$/ этот шаблон будет соответствовать этому времени, будет работать только d. Else d не работает. d используется для удаления всего содержимого паттерна, а затем запускается следующий цикл.

Ответ 5

Просто подключите его к команде "uniq" и все пустые строки, независимо от того, сколько их будет сокращено до одного. Упрощеннее.

Уточнение: поскольку Марлар заявил, что это не решение, если у вас есть "другие непустые последовательные дублированные строки", от которых вы не хотите избавляться. Это решение в других случаях, например, при попытке очистить файлы конфигурации, которые были решением, которое я получил после того, как я увидел этот вопрос. Я решил свою проблему, просто используя "uniq".