Como obter uma linha usando um padrão antes de um número de linha?

1

Eu preciso de uma linha que corresponda a um padrão antes de um determinado número de linha de um arquivo.

Exemplo:

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

Do arquivo acima, quero line8. Eu sei que vai ficar acima da linha 20, e eu sei que essa linha contém apple .

    
por Anthony 29.08.2018 / 11:58

3 respostas

1

Apesar de a tag ser sed , minha resposta não usa sed .

O comando a seguir usa as primeiras 19 linhas, descarta as que não têm apple e retorna a última linha do que resta:

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

Para processar um arquivo chamado file.txt :

<file.txt head -n 19 | grep "apple" | tail -n 1
    
por 29.08.2018 / 12:10
1

Aqui está uma solução usando sed :

sed -n '20,$d;/apple/h;19{x;p}'
  • -n - suprime a impressão de linhas
  • 20,$d - para qualquer linha de 20 até o final do arquivo ( $ ), delete ( d ) it
  • /apple/h - para qualquer linha que corresponda à regex /apple/ , copie-a para o " espaço de espera " ( h )
  • 19{x;p} - na linha 19 , troque o padrão e mantenha espaços ( x ) e imprima o espaço padrão ( p )

Observe que é necessário usar a linha 19 para a impressão final, porque todas as linhas depois disso são excluídas. Caso contrário, você poderia usar o endereço " última linha " - $ .

Neste teste, adicionei um apple à linha 23.

$ sed -n '20,$d;/apple/h;19{x;p}' < file
linenum 8.apple2
    
por 29.08.2018 / 14:28
0

Mesma solução já publicada, desta vez em Perl:

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

e AWK:

awk 'NR<20 && /apple/ {a=$0} END{print a}' input.txt
    
por 02.09.2018 / 14:51

Tags