Как заменить несколько пустых строк одной пустой строкой в ​​bash? - PullRequest
33 голосов
/ 28 мая 2009

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

something



something else

something else again

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

something

something else

something else again

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

Ответы [ 13 ]

74 голосов
/ 01 июня 2009

Для систем на основе BSD (включая GNU):

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

cat -s

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

15 голосов
/ 22 июля 2016

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

sed 'N;/^\n$/D;P;D;'
13 голосов
/ 28 мая 2009
grep -A1 . <yourfile> | grep -v "^--$"

Это решение grep работает при условии, что вам нужно следующее:

Input

line1

line2
line3


line4



line5

выход

line1

line2
line3

line4

line5
11 голосов
/ 28 мая 2009

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

something
something else
something else again

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

sed /^$/d FILE
3 голосов
/ 26 июля 2013

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

for i in *; do FILE=$(cat -s "$i"); echo "$FILE" > "$i"; done
3 голосов
/ 28 мая 2009

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

awk '
BEGIN {
    blank = 0;
}

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

{
     print;
     blank = 0;
}' file
3 голосов
/ 28 мая 2009

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

awk 'BEGIN{bl=0}/^$/{bl++;if(bl==1)print;else next}/^..*$/{bl=0;print}' myfile
2 голосов
/ 27 мая 2013

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

perl -00pe0 < file

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

1 голос
/ 22 июля 2016

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

import re
import sys
sys.stdout.write(re.sub('\n{2,}','\n\n', sys.stdin.read()))
1 голос
/ 28 мая 2009

Использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...