Как получить строку, используя шаблон перед номером строки?

Мне нужно получить строку, которая соответствует шаблону перед определенным номером строки файла.

Пример:

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
Другие вопросы по тегам