2013-08-12 5 views
3

Я хочу извлечь N-ю строку после соответствующего шаблона, используя grep, awk или sed.Извлечение N-й строки после сопоставления рисунка

Например, у меня есть этот кусок текста:

 Revision: 
     60000<br /> 

И я хочу, чтобы извлечь 60000.

Я попытался Revision:([a-z0-9]*)\s*([0-9]){5}, который соответствует Revision вместе с номером версии, но когда я передать его Grep : grep Revision:([a-z0-9]*)\s*([0-9]){5} file.html Я ничего не получаю.

Как я могу это достичь?

ответ

13

Для extract the Nth line after a matching pattern вы хотите:

awk 'c&&!--c;/pattern/{c=N}' file 

например

awk 'c&&!--c;/Revision:/{c=5}' file 

напечатал 5-ю строчку после текста «Редакция:» /.

FYI следующие идиомы описывают, как выбрать диапазон записей, дан конкретный шаблон для соответствия:

а) Печать всех записей из некоторого шаблона:

awk '/pattern/{f=1}f' file 

б) Распечатать все записи после того, как некоторые картина:

awk 'f;/pattern/{f=1}' file 

с) Печать Nth запись после некоторого шаблона:

awk 'c&&!--c;/pattern/{c=N}' file 

г) Печать каждую запись, кроме N-й записи после некоторой схеме:

awk 'c&&!--c{next}/pattern/{c=N}1' file 

е) Вывести N записи после некоторой схеме:

awk 'c&&c--;/pattern/{c=N}' file 

е) печати каждой записи кроме N записи после некоторой схеме:

awk 'c&&c--{next}/pattern/{c=N}1' file 

г) Вывести N записей из некоторого шаблона:

Я изменил имя переменной с «f» на «найдено» на «c» для «подсчета», когда это необходимо, поскольку это более выразительно, чем переменная на самом деле является IS.

+1

'c &&! - c' эквивалентно' c! = 0 && --c == 0' и 'c && c -' эквивалентно 'c! = 0 && --c> = 0'; альтернативы могут быть проще понять. – musiphil

+1

Одно из предостережений заключается в том, что если шаблон появляется снова, прежде чем перейти к следующей линии N'th, счетчик будет сброшен, а предыдущие появления будут забыты. Например, в c), если N = 10, а шаблон - в строках 21 и 28, тогда будет напечатана только строка 38, но не строка 31. Чтобы справиться с этим, вы можете использовать 'awk '/ pattern/{p [ NR + N] = 1} NR в p'' (проще) или 'awk '/ pattern/{p [NR + N] = 1} NR в p {print; delete p [NR]} ''(ограничивает использование памяти). – musiphil

+0

Как изменить f.), Чтобы не печатать строку с рисунком (это делается сейчас)? – Betlista

Смежные вопросы