Какая лучшая команда оболочки для вывода строк файла до тех пор, пока вы не встретите первую пустую строку? Например:
output these
lines
but do not output anything after the above blank line
(or the blank line itself)
ок? что-то другое?
Какая лучшая команда оболочки для вывода строк файла до тех пор, пока вы не встретите первую пустую строку? Например:
output these
lines
but do not output anything after the above blank line
(or the blank line itself)
ок? что-то другое?
Еще awk
:
awk -v 'RS=\n\n' '1;{exit}'
Еще sed
:
sed -n -e '/./p;/./!q'
sed -e '/./!{d;q}'
sed -e '/./!Q' # thanks to Jefromi
Как насчет непосредственно в оболочке?
while read line; do [ -z "$line" ] && break; echo "$line"; done
(Или printf '%s\n'
вместо echo
, если ваша оболочка глючит и всегда обрабатывает escape-последовательности.)
'/./!Q'
— Q
завершает работу немедленно, без автопечати. +1
- person Cascabel; 22.10.2009
'/./!Q'
2,5 с; '/./!{d;q}'
5,5 с; '/^$/Q'
7,5 с.
- person Cascabel; 22.10.2009
sed
(который устанавливается в OSX по умолчанию) не поддерживает модификаторы q
или Q
.
- person dimo414; 01.03.2017
С СЭД:
sed '/^$/Q' <file>
Редактировать: sed намного быстрее. См. Ответ ephemient для самой быстрой версии.
Чтобы сделать это в awk, вы можете использовать:
awk '{if ($0 == "") exit; else print}' <file>
Обратите внимание, что я написал это намеренно, чтобы избежать использования регулярных выражений. Я не знаю, на что похожа внутренняя оптимизация awk, но подозреваю, что прямое сравнение строк будет быстрее.
sed
(который устанавливается в OSX по умолчанию) не поддерживает модификаторы q
или Q
.
- person dimo414; 01.03.2017
Awk-решение
awk '/^$/{exit} {print} ' <filename>
1
короче, чем запись {print}
, и делает то же самое.
- person ephemient; 22.10.2009
Вот решение с использованием Perl:
#! perl
use strict;
use warnings;
while (<DATA>) {
last if length == 1;
print;
}
__DATA__
output these
lines
but don't output anything after the above blank line
(or the blank line itself)
$ perl -pe'last if /^$/' file..
$ perl -lpe'last unless length' file..
Другое решение Perl:
perl -00 -ne 'print;exit' file
perl -00 -pe 'exit if $. == 2' file
sed -e '/^$/,$d' <file>
. Кроме того, если у вас есть огромные файлы (или их много), может возникнуть проблема с чтением всего файла. В остальном красиво и коротко!
- person Cascabel; 22.10.2009