Как заменить несколько пустых строк на одну пустую строку в bash?
У меня есть файл, который содержит:
something
something else
something else again
Мне нужна команда bash, sed/grep w.e, которая будет выдавать следующий вывод
something
something else
something else again
Другими словами, мне нужно заменить несколько пустых строк только одной пустой строкой. grep/sed являются линейными. Я никогда не нашел решение bash, которое будет работать на многострочных шаблонах регулярных выражений.
Ответы
Ответ 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 может быть решением (если не пустые строки не дублируются)