1

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

Пример:

linenum 1.fruits
linenum 2.cherry
linenum 3.apple
.
.
linenum 7.orange
linenum 8.apple2
.
.
.
linenum 20.strawberry

Из приведенного выше файла, я хочу line8. Я знаю, что это будет выше линии 20, и я знаю, что в этой строке содержится apple .

3 ответа3

1

Несмотря на тег , мой ответ не использует sed .

Следующая команда занимает первые 19 строк, отбрасывает строки без apple , а затем возвращает последнюю строку из того, что осталось:

head -n 19 | grep "apple" | tail -n 1

Чтобы обработать файл с именем file.txt:

<file.txt head -n 19 | grep "apple" | tail -n 1
1

Вот решение с использованием 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
0

То же решение, что уже было опубликовано, на этот раз в 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .