удалить от начала файла до n-го вхождения шаблона

удалить от начала файла до n-го вхождения шаблона

Поиск команды командной строки (awk, sed и т. д.) для пропуска строк от начала файла до n-го вхождения шаблона. Другими словами, печатать только от n-го вхождения шаблона до конца файла. Предположим, что на строку приходится одно совпадение; строка не обязательно начинается с шаблона.

например, пропустить от начала файла до второго fooв следующем:

something
abc foo1
maybe something else
foo2 -this line and anything before is gone- 
maybe not
foo3
something

Желаемый результат:

maybe not
foo3
something

Бонусные баллы за включение/исключение строки с n-ным вхождением.

решение1

Кисключатьn-ое появление шаблона

awk -v 'n=3' 'NR == 1, /pattern/ && !--n {next}; 1'

(замените 3на желаемое количество вхождений (в вашем случае 2) и patternна ваш фактический шаблон ( fooв вашем случае)).

Пример:

$ seq 30 | awk -v 'n=3' 'NR == 1, /6/ && !--n {next}; 1'
27
28
29
30

Квключатьn-ое появление шаблона

awk -v 'n=3' '/pattern/ && !--n, 0'

Пример:

$ seq 30 | awk -v 'n=3' '/6/ && !--n, 0'
26
27
28
29
30

решение2

% perl -ne 'BEGIN{$NTH=2;$p=0} print if $p; /foo/ && $NTH--; $p=1 if !$NTH' input
maybe not
foo3
something

Где NTH— сколько раз, а затем вам нужен флаг для печати; уменьшайте NTHпри совпадении и разрешайте печать, если NTHуменьшите достаточно.Двигайтесь printк концу, чтобы поймать желаемое foo.

Связанный контент