Extrai uma linha de um arquivo com sed

3

Como eu escrevo um script sed que varre o arquivo de entrada para "start" e encontra a linha contendo "next" e exibe a seguinte linha? Algo parecido com isto:

[user]$ cat test.txt
start
next
This line should print
Ignore this


[user]$ display.sed test.txt
This line should print

[user]$ cat test1.txt
Ignore this
next
Ignore this
start
Ignore this
next
This line should print
Ignore this
next
Too late so ignore this too
start
Ignore this too

[user]$ display.sed test1.txt
This line should print
    
por Hazem Ahmed 29.10.2017 / 23:58

3 respostas

3

Você pode usar um intervalo (da primeira ocorrência de start até o final do arquivo) e d excluir todas as linhas desse intervalo que não correspondam a next . Se uma linha corresponder, leia a linha n ext, p rint então q uit:

sed -n '/start/,${
/next/!d;n;p;q
}' infile

Eu acho que você realmente quer um arquivo display.sed com o seguinte conteúdo:

#!/bin/sed -nf

/start/,${
/next/!d;n;p;q
}
    
por 30.10.2017 / 00:14
2

Usar awk seria mais apropriado para tal caso, pois ele deveria funcionar mesmo em implementações não-GNU awk :

awk '/^start/{ f=1 }f && /^next/ && getline nl>0{ print nl; exit }' test.txt
  • /^start/{ f=1 } - definir sinalizador ativo f=1 ao encontrar a linha start

  • f && /^next/ && getline nl>0 - ao encontrar next line (com a correspondência anterior start line - assegurada pelo ativo f flag) - verifique se a próxima linha necessária existe com getline nl>0

  • nl ("linha necessária") - contém a linha seguinte linha next

A saída (para o seu conteúdo de entrada atual):

This line should print
    
por 30.10.2017 / 00:15
1

Que tal grep ? Eu adicionarei explicação, se este comando fizer, o que você quer.

grep -Pzo '(?s)start.*?next\n\K.*?\n' input.txt

Entrada (seus dois exemplos foram mesclados)

start
next
This line should print
Ignore this
Ignore this
next
Ignore this
start
Ignore this
next
This line should print
Ignore this
next
Too late so ignore this too 
start
Ignore this too 

Resultado

This line should print
This line should print
    
por 30.10.2017 / 00:53