шаблон диапазона awk - сделать что-то в начале шаблона диапазона

Мне нужно знать, какая строка соответствует шаблону диапазона с помощью awk. Предположим, у меня есть следующий ввод:

some random text
some random text START this is first line I want to match with START
some random text
some random text
some random text
some random text START this line contains another START but I dont want matched this line
some random text
some random text END this line is last of my range
some random text
... input text countinues, more range matches can be found

Как я хотел соответствовать:

/START/,/END/ {
if ((index($0,"START"))) {
# do something when range starts
}
#do some other things
}

Но потом я понял, что мой индекс будет соответствовать START в строке 6 в середине диапазона. Я думаю о поднятии флага после первого совпадения START с индексом, но есть ли более элегантный способ, например, глобальная переменная, похожая на NR?

РЕДАКТИРОВАТЬ: ввод текста продолжается, можно найти больше совпадений диапазона, если бы я поднял флаг или использовал подсчет, мне пришлось бы сбросить флаг/счетчик после окончания диапазона (добавить индекс ($ 0, "END")), чего я не хочу


person roslav    schedule 04.07.2012    source источник


Ответы (2)


Вы можете сначала прочитать все в массив, а затем работать только с его первым элементом. Я не уверен, что его можно было бы сделать красивее, чем маркерный флаг.

person lynxlynxlynx    schedule 04.07.2012

В одну сторону. Попробуйте увеличить переменную внутри диапазона, только если она равна 1 и соответствует началу диапазона. Во второй строке START будет 5 и проверка i == 1 не пройдет.

/START/,/END/ {
    ++i 
    if ( i == 1 ) { 
        print "Range starts"
    }   
    print "Other things"
}
person Birei    schedule 04.07.2012