Как получить строку, используя шаблон перед номером строки?
Мне нужно получить строку, которая соответствует шаблону перед определенным номером строки файла.
Пример:
linenum 1.fruits
linenum 2.cherry
linenum 3.apple
.
.
linenum 7.orange
linenum 8.apple2
.
.
.
linenum 20.strawberry
Из приведенного выше файла, я хочу line8. Я знаю, что это будет выше строки 20, и я знаю, что строка содержит apple
,
3 ответа
Вот решение с использованием sed
:
sed -n '20,$d;/apple/h;19{x;p}'
-n
- подавить печать строк20,$d
- для любой строки из20
в конец файла ($
), удалять (d
) Это/apple/h
- для любой строки, которая соответствует регулярному выражению/apple/
скопируй его в "трюм" (h
)19{x;p}
- онлайн19
, поменять шаблон и удерживать пробелы (x
) и распечатайте пространство шаблона (p
)
Обратите внимание, что необходимо использовать линию 19
для окончательной печати, потому что все строки после этого удаляются. В противном случае вы можете использовать адрес "последней строки" - $
,
В этом тесте я добавил apple
к строке 23.
$ sed -n '20,$d;/apple/h;19{x;p}' < file
linenum 8.apple2
Несмотря на тег sed, мой ответ не использует sed
,
Следующая команда занимает первые 19 строк, отбрасывает без apple
, затем возвращает последнюю строку из того, что осталось:
head -n 19 | grep "apple" | tail -n 1
Обработать файл с именем file.txt
:
<file.txt head -n 19 | grep "apple" | tail -n 1
То же решение, которое уже было опубликовано, на этот раз в Perl:
perl -lane 'if(1..19 and /apple/){$a=$_} END{print $a}' input.txt
и AWK:
awk 'NR<20 && /apple/ {a=$0} END{print a}' input.txt