Как заставить sed напечатать диапазон строк, пока он не увидит две последовательные пустые строки? - PullRequest
5 голосов
/ 21 декабря 2009

Я бы хотел использовать скрипт Sed, как этот

#n
/^TODO/,/^$/p

за исключением того, что sed должен прекратить печать диапазона после того, как он встретит две последовательные пустые строки, а не только одну пустую строку Затем следует продолжить сканирование для следующего интересующего диапазона. Другими словами, конец диапазона интересов определяется двумя пустыми строками. Я даже не уверен, что диапазон адресов может удовлетворить такого рода требования, поэтому, если есть другой способ сделать это, пожалуйста, дайте мне знать.

Ответы [ 5 ]

6 голосов
/ 21 декабря 2009

Это должно прекратиться, когда встречаются две последовательные пустые строки независимо от нечетного / четного сочетания пустых строк с непустыми строками:

Не печатать две пустые строки:

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

Распечатать один из них:

sed -n 'N;/^\n$/{P;q};P;D'

Распечатать их обоих:

sed -n 'N;/^\n$/{p;q};P;D'

Изменить:

А вот как вы могли бы заставить это работать в вашем диапазоне:

sed -n '/^TODO/,${N;/^\n$/q;P;D}'

Редактировать 2:

В комментариях и отредактированных требованиях * dan (кажется, это работает, чтобы найти шаблон в диапазоне, который заканчивается двумя пустыми строками, несколько раз в файле:

sed -n '/^TODO/,/^$/{H;N;/^\n$/{b};p}'
1 голос
/ 21 декабря 2009

используйте sed для простой замены.

$ more file
1
2
blah blah
TODO
blah blah
4
5


6
7
8
9
10


11
end
$ awk -vRS="\n\n" '/TODO/{print;exit}' file
1
2
blah blah
TODO
blah blah
4
5
0 голосов
/ 13 марта 2012

Это может работать для вас:

sed '/^TODO/!d;:a;$!{N;s/\n$//;t;ba}' file
0 голосов
/ 21 декабря 2009

Опираясь на ответ SiegeX:

cat > lines <<'EOF'
a


c
d
EOF
sed '/^$/N; /^\n$/q' lines
0 голосов
/ 21 декабря 2009
sed 'N;/^\n$/q;P;D'

Подтверждение концепции

$ cat double_blank.txt
foo
bar

baz


blah
one
two

three

Результат

$ sed 'N;/^\n$/q;P;D' double_blank.txt
foo
bar

baz


...