Для входного файла, который выглядит следующим образом:
1 pat2
2 x
3 pat1
4 x
5 pat2
6 x
7 pat1
8 x
9 pat2
Вы можете использовать sed следующим образом:
$ sed -n '/pat1/,${/pat2/{=;q;};}' infile
5
, который работает так:
sed -n ' # suppress output with -n
/pat1/,$ { # for all lines from the first occurrence of "pat1" on...
/pat2/ { # if the line matches "pat2"
= # print line number
q # quit
}
}' infile
Вышеприведенное не выполняется, если первое вхождение pat1
находится на той же строке, что и pat2
:
1 pat2
2 x
3 pat1 pat2
4 x
5 pat2
6 x
7 pat1
8 x
9 pat2
напечатает 3
. С помощью GNU sed мы можем использовать это вместо:
$ sed -n '0,/pat1/!{/pat2/{=;q;};}' infile
5
sed -n ' # suppress output
0,/pat1/! { # for all lines after the first occurrence of "pat1"
/pat2/ { # if the line matches "pat2"
= # print line number
q # quit
}
}' infile
Адрес 0
является расширением GNU; использование 1
вместо этого прервется, если pat1
будет в первой строке.