grep нуть блок
Модераторы: /dev/random, Модераторы разделов
-
jojahti
- Сообщения: 310
grep нуть блок
Есть такая возможность? Некоторые программы выводят информацию блоками.
То есть например:
[[:пробел:]]
блок текста
блок текста
[[:пробел:]]
блок текста с ключевым словом
блок текста
[[:пробел:]]
блок текста
блок текста
[[:пробел:]]
Как бы грепнуть сразу блок текста с искомым совпадением, ограниченный ключевыми словами?
То есть например:
[[:пробел:]]
блок текста
блок текста
[[:пробел:]]
блок текста с ключевым словом
блок текста
[[:пробел:]]
блок текста
блок текста
[[:пробел:]]
Как бы грепнуть сразу блок текста с искомым совпадением, ограниченный ключевыми словами?
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
Re: grep нуть блок
1) "[[:пробел:]]" - это строка с пробелом, пустая строка, или же просто пробел, не выделенный в отдельную строку?
2) "ограниченный ключевыми словами" - в смысле? "блок блок блок foo блок блок блок bar блок блок блок" - так? И нужно выделить то, что между foo и bar?
2) "ограниченный ключевыми словами" - в смысле? "блок блок блок foo блок блок блок bar блок блок блок" - так? И нужно выделить то, что между foo и bar?
-
liaonau
- Сообщения: 390
- ОС: gentoo
Re: grep нуть блок
или же вы хотите поймать что-то вроде bc в блоке типа
<h1>
aaaa
bbbb
cccc
dddd
</h1>
Возможно, с концом выражения на другой строке?
<h1>
aaaa
bbbb
cccc
dddd
</h1>
Возможно, с концом выражения на другой строке?
-
jojahti
- Сообщения: 310
Re: grep нуть блок
/dev/random
Любая наперёд известная последовательность символов.
Ага только это разные строки, а grep у меня почему-то только одну грепает.
"блок/n
блок/n
блок/n
foo/n
блок/n
блок/n
блок/n
bar/n
блок/n
блок/n
блок/n"
Например lspci -v выдаёт блоки разделённые пустыми строками. Наверняка эти блоки как-то выхватить можно.
liaonau
Ну в общем виде вопрос можно переформулировать, как: "как выхватывать с помощью linux-овских утилит кусочки текста, лежащие на разных строках"
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 нуть блок
Простейший способ: временно сделать разные строки одной.
tr'ом заменить переводы строк на символы, которые точно не встретятся в тексте (напр., \x01), затем заменить разделители блоков на переводы строк, грепнуть, а затем вновь заменить временные символы на переводы строк.
tr'ом заменить переводы строк на символы, которые точно не встретятся в тексте (напр., \x01), затем заменить разделители блоков на переводы строк, грепнуть, а затем вновь заменить временные символы на переводы строк.
-
jojahti
- Сообщения: 310
Re: grep нуть блок
Наверно лучше использовать для этого не grep.
-
liaonau
- Сообщения: 390
- ОС: gentoo
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: 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 нуть блок
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 нуть блок
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
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE