Найти цепочку смежных строк одной командой.

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

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

nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Найти цепочку смежных строк одной командой.

Сообщение nick87720z »

Пробовал в консоли:

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

grep -n "stroke1
stroke2
stroke3" ./test


В результате чего получаю список отдельных строк, как если бы использовал grep отдельно для каждой строки. Нельзя ли сделать это одной командой? А то приходится еще номера отдирать и проверять их подряд...
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Найти цепочку смежных строк одной командой.

Сообщение sash-kan »

grep работает с каждой строкой отдельно.
что именно вы хотите получить в самом итоге?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: Найти цепочку смежных строк одной командой.

Сообщение nick87720z »

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

$echo -e "hello\nworld\nhello\nworld\nbye" > ./test
$grep -e "world
hello" ./test
1:hello
2:world
3:hello
4:world

Необходимо найти не отдельные строки, как здесь, а их последовательность `echo -e "world\nhello"`, которая в данном случае только одна.
Может это делается и не через grep?
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Найти цепочку смежных строк одной командой.

Сообщение Nazyvaemykh »

могу предложить примерно такой вариант с sed, возможно, он работает не совсем правильно…

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

#!/bin/sed -nf
/stroke1/{
    :a;
    n;
    /stroke2/ {
        n;
            /stroke3/ {
                s/^/stroke1\nstroke2\n/;p;
            };
            /stroke1/ ba;
    };
    /stroke1/ ba;
};
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Найти цепочку смежных строк одной командой.

Сообщение Nazyvaemykh »

Исправил, вроде, стало более кавайно:

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

#!/bin/sed -nf
/stroke1/{
    :a;
    h;n;
    /stroke2/ {
        H;n;
            /stroke3/ {
                H;g;p;
            };
            /stroke1/ ba;
    };
    /stroke1/ ba;
};
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: Найти цепочку смежных строк одной командой.

Сообщение nick87720z »

Почти то, только мне нужен номер первой строки.
Пробовал ставить '=;' после 'h', из за чего он выдавал лишние номера строк, хотя сами строки в том же количестве.
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: Найти цепочку смежных строк одной командой.

Сообщение nick87720z »

Сделал, проверил, работает

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

/hello/{ :a
    =;n;
    /world/ { n
            /people man/ q0
            /hello/ ba
    }; /hello/ ba
}


Осталось придумать генератор этого скрипта :D
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Найти цепочку смежных строк одной командой.

Сообщение sash-kan »

nick87720z писал(а):
22.03.2010 01:35
Может это делается и не через grep?
не то чтобы совсем «не через grep». через немножко иную реализацию, sgrep, гораздо удобнее находить паттерны, разнесённые по нескольким строкам.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: Найти цепочку смежных строк одной командой.

Сообщение nick87720z »

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

cat ./test2 | sgrep -o "%s\n" '"stroke1\nstroke2"'

Супер! Всем спасибо.
Спасибо сказали: