grep нуть блок

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
jojahti
Сообщения: 310

grep нуть блок

Сообщение jojahti »

Есть такая возможность? Некоторые программы выводят информацию блоками.
То есть например:

[[:пробел:]]
блок текста
блок текста
[[:пробел:]]
блок текста с ключевым словом
блок текста
[[:пробел:]]
блок текста
блок текста
[[:пробел:]]

Как бы грепнуть сразу блок текста с искомым совпадением, ограниченный ключевыми словами?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: grep нуть блок

Сообщение /dev/random »

1) "[[:пробел:]]" - это строка с пробелом, пустая строка, или же просто пробел, не выделенный в отдельную строку?
2) "ограниченный ключевыми словами" - в смысле? "блок блок блок foo блок блок блок bar блок блок блок" - так? И нужно выделить то, что между foo и bar?
Спасибо сказали:
liaonau
Сообщения: 390
ОС: gentoo

Re: grep нуть блок

Сообщение liaonau »

или же вы хотите поймать что-то вроде bc в блоке типа
<h1>
aaaa
bbbb
c
ccc
dddd
</h1>
Возможно, с концом выражения на другой строке?
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: grep нуть блок

Сообщение jojahti »

/dev/random
1) "[[:пробел:]]" - это строка с пробелом, пустая строка, или же просто пробел, не выделенный в отдельную строку?

Любая наперёд известная последовательность символов.

2) "ограниченный ключевыми словами" - в смысле? "блок блок блок foo блок блок блок bar блок блок блок" - так? И нужно выделить то, что между foo и bar?

Ага только это разные строки, а grep у меня почему-то только одну грепает.
"блок/n
блок/n
блок/n
foo/n
блок/n
блок/n
блок/n
bar/n
блок/n
блок/n
блок/n"

Например lspci -v выдаёт блоки разделённые пустыми строками. Наверняка эти блоки как-то выхватить можно.

liaonau
Ну в общем виде вопрос можно переформулировать, как: "как выхватывать с помощью linux-овских утилит кусочки текста, лежащие на разных строках"
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: grep нуть блок

Сообщение /dev/random »

Простейший способ: временно сделать разные строки одной.

tr'ом заменить переводы строк на символы, которые точно не встретятся в тексте (напр., \x01), затем заменить разделители блоков на переводы строк, грепнуть, а затем вновь заменить временные символы на переводы строк.
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: grep нуть блок

Сообщение jojahti »

Наверно лучше использовать для этого не grep.
Спасибо сказали:
liaonau
Сообщения: 390
ОС: gentoo

Re: grep нуть блок

Сообщение liaonau »

jojahti писал(а):
27.02.2011 22:13
Наверно лучше использовать для этого не grep.

Вы правы, grep ищет только по строке.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: grep нуть блок

Сообщение NickLion »

jojahti писал(а):
27.02.2011 22:13
Наверно лучше использовать для этого не grep.

Можно, например, что-то на perl'е наваять. Так навскидку:

Код: Выделить всё

perl -e 'print join "новый разделитель блоков", grep { /ключевое слово/ } split "[[:пробел:]]", join "", <>;'


Допустим так:

Код: Выделить всё

lspci -v | perl -e 'print join "\n-------\n", grep { /VGA/ } split "\n\n", join "", <>;'
Спасибо сказали:
liaonau
Сообщения: 390
ОС: gentoo

Re: grep нуть блок

Сообщение liaonau »

NickLion писал(а):
27.02.2011 22:32
Допустим так:

Код: Выделить всё

lspci -v | perl -e 'print join "\n-------\n", grep { /VGA/ } split "\n\n", join "", <>;'

Или, например, так

Код: Выделить всё

lspci -v | perl -ne '$/="\n\n"; s/$\///g; print if(/VGA/)'
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: grep нуть блок

Сообщение NickLion »

liaonau писал(а):
27.02.2011 23:30
Или, например, так

Код: Выделить всё

lspci -v | perl -ne '$/="\n\n"; s/$\///g; print if(/VGA/)'

Да, про $/ не подумал, почему-то :) Тогда предлагаем так:

Код: Выделить всё

lspci -v | perl -e '$/="\n\n"; print grep {/VGA/} <>'

Мне так больше нравится :)
Спасибо сказали:
liaonau
Сообщения: 390
ОС: gentoo

Re: grep нуть блок

Сообщение liaonau »

NickLion писал(а):
27.02.2011 23:42
Мне так больше нравится :)

TMTOWTDI ☺
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: grep нуть блок

Сообщение t.t »

¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: