Как получить строку, используя шаблон перед номером строки?
Мне нужно получить строку, которая соответствует шаблону перед определенным номером строки файла.
Пример:
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