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

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

У меня есть файл, который содержит:

something



something else

something else again

Мне нужна команда bash, sed/grep w.e, которая будет выдавать следующий вывод

something

something else

something else again

Другими словами, мне нужно заменить несколько пустых строк только одной пустой строкой. grep/sed являются линейными. Я никогда не нашел решение bash, которое будет работать на многострочных шаблонах регулярных выражений.

4b9b3361

Ответ 1

Для BSD-производных систем (включая GNU):

Вам просто нужно cat с опцией -s, которая заставляет его удалять повторяющиеся пустые строки с его вывода:

cat -s

Из справочной страницы: -s --squeeze-blank: suppress repeated empty output lines.

Ответ 2

grep -A1 . <yourfile> | grep -v "^--$"

Это решение grep работает, если вы хотите следующее:

Ввод

line1

line2
line3


line4



line5

Выход

line1

line2
line3

line4

line5

Ответ 3

Я решил эту проблему только sed. Даже если это 7-летний вопрос, кто-то может здесь помочь, поэтому я пишу свое решение sed здесь:

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

Ответ 4

На самом деле, если вы замените несколько строк новой строки на одну новую строку, вывод будет следующим:

something
something else
something else again

Вы можете достичь этого:

sed /^$/d FILE

Ответ 5

Решение с awk, которое заменяет несколько пустых строк одной пустой строкой:

awk 'BEGIN{bl=0}/^$/{bl++;if(bl==1)print;else next}/^..*$/{bl=0;print}' myfile

Ответ 6

Обычно, если я нахожу, что sed не может сделать что-то, что мне нужно, я перехожу к awk:

awk '
BEGIN {
    blank = 0;
}

/^[[:blank:]]*$/ {
     if (!blank) {
          print;
     }
     blank = 1;
     next;
}

{
     print;
     blank = 0;
}' file

Ответ 7

Это использует решение marco для нескольких файлов:

for i in *; do FILE=$(cat -s "$i"); echo "$FILE" > "$i"; done

Ответ 8

Использовать python:

s = file("filename.txt").read()
while "\n\n\n" in s: s = s.replace("\n\n\n", "\n\n")
import sys
sys.stdout.write(s)

Ответ 9

Если кто-то хочет использовать perl

perl -00pe0 < file

сделает то же самое, что и cat -s:)

Ответ 10

Python с регулярным выражением:

import re
import sys
sys.stdout.write(re.sub('\n{2,}','\n\n', sys.stdin.read()))

Ответ 11

Супер легко сделать с vim. Просто откройте файл и введите следующее:

:%s/\n\n\n*/\r\r/

Это уменьшит все блоки из более чем 2 новых строк до 2 новых строк. Надеюсь, это поможет!

Ответ 12

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

Это можно сделать с помощью

sed /^[:space:]*$/d FILE

Ответ 13

Конвейеризация его в uniq может быть решением (если не пустые строки не дублируются)