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

410
Anthony

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

Пример:

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

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

1
Что вы хотите сделать с line8? Что вы пробовали На большинство вопросов можно ответить [здесь] (http://www.grymoire.com/unix/sed.html). AFH 6 лет назад 1
С какими критериями (кроме "_it has` apple`_ ") вы работаете? Просто любая строка выше строки 20, которая имеет `apple`? Attie 6 лет назад 1
Пожалуйста, добавьте некоторый контекст и покажите свои усилия, иначе это похоже на упражнение по изучению `sed`. simlev 6 лет назад 0

3 ответа на вопрос

1
Kamil Maciorowski

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

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

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

Для обработки файла с именем file.txt:

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

Вот решение с использованием sed:

sed -n '20,$d;/apple/h;19' 
  • -n - подавить печать строк
  • 20,$d- для любой строки от 20до конца файла ( $), удалите ( d) его
  • /apple/h- для любой строки, совпадающей с регулярным выражением /apple/, скопируйте ее в « пространство для хранения » ( h)
  • 19- в строке 19поменяйте местами шаблон и удерживайте пробелы ( x) и напечатайте пространство шаблона ( p)

Обратите внимание, что необходимо использовать строку 19для окончательной печати, потому что все строки после этого удаляются. В противном случае вы можете использовать адрес « последней строки » - $.


В этом тесте я добавил appleстроку 23.

$ sed -n '20,$d;/apple/h;19' < file linenum 8.apple2 
0
simlev

То же решение, что уже было опубликовано, на этот раз в Perl:

perl -lane 'if(1..19 and /apple/){$a=$_} END' input.txt 

и AWK:

awk 'NR<20 && /apple/ END' input.txt