Obtém texto entre uma palavra e a última linha?

3

De acordo com as respostas na pergunta do Stack Overflow Como usar o sed / grep para extrair texto entre duas palavras? , podemos obter texto entre duas palavras:

sed -n "/first/,/second/p" file

Mas e se eu quiser obter texto entre uma palavra e a última linha do arquivo, como a seguir?

sed -n "/word/,/lastline/p" file
    
por user78050 19.08.2014 / 14:19

2 respostas

5

Incluindo a última linha que você faria:

sed -n '/word/,$p'

Corresponde à primeira ocorrência de word até a última linha e imprime todas as correspondências.

Não incluindo a última linha:

sed '/word/,$!d;$d'

... que exclui as correspondências negadas e exclui a última linha.

E para ir apenas do último jogo até a última linha, você precisa tentar um pouco mais:

 sed -e :n -e '/\n.*word/D;N;$q;bn'

Loops - ele nunca completa o ciclo de linha normal sed , mas anexa a próxima linha de entrada ao buffer de espaço de padrão e b ranches novamente para fazer isso novamente. Mas quando tem pelo menos duas linhas no espaço padrão e a última corresponde a palavra , apaga tudo no buffer, mas a linha que corresponde a palavra . Na última linha, apenas quits e quebra o loop. Então, o que é impresso é tudo, desde a última linha que está ocorrendo contendo palavra até a última linha.

Hmmm ... talvez eu tenha feito isso mais difícil do que tem que ser:

sed 'H;$x;/word/h;$!d'

Com isso, cada linha é anexada para manter o espaço. Mas as linhas que combinam com palavra então sobrescrevem retêm espaço. Cada linha no espaço padrão que não é a última linha é excluída. E na última linha, logo após ser anexado para manter espaço, os espaços hold e pattern são trocados (no caso da última linha também conter word) e tudo desde a última vez word espaço de suspensão sobrescrito é impresso.

    
por 19.08.2014 / 14:24
2

Também pode usar o awk

incluindo correspondência ao final do arquivo

awk '/word/{x=1}x' file

Após a primeira partida até o final do arquivo

awk 'x;/word/{x=1}' file
    
por 19.08.2014 / 14:32