Retornando apenas o conteúdo antes e depois de um número de linha com diferentes palavras correspondentes

0

Estou usando o cygwin.

Eu conheço a linha # na minha mão. O script deve procurar a primeira ocorrência da string mono acima de um número de linha especificado e procurar pela primeira ocorrência da string /mono abaixo dos números de linha especificados e retornar apenas o conteúdo entre os mono e /mono .

Entrada:

I have known line # in my hand.  
Script should look for the first occurrence of word mono  
not monoono  
above a specified line #  
and look for the  
first occurrence of word /mono below the specified line #s  
and return ONLY the contents between those 'mono' and /mono  

Resultado esperado

mono 
not monoono  
above a specified line #  
and look for the  
first occurrence of word /mono  

Como posso fazer isso?

    
por Samuel Finny 15.09.2017 / 10:25

2 respostas

2

Versão compacta com o GNU sed :

sed -E 'H;4!d;g;s/.*\<mono\>/mono/;:a;N;s_/mono\>.*_/mono_;Ta' in

Explicação:

  • H coleta todas as linhas no espaço de espera
  • 4!d suprime toda a saída, exceto a quarta linha
  • Na quarta linha, mova o espaço de suspensão para o espaço de padrão ( g ) e remova tudo até a palavra mono com o comando s
  • :a; ... ;Ta forma um loop acrescentando linhas com N até /mono ser lido
por 15.09.2017 / 12:39
0
awk -v L=4 '(NR<L && $0 ~ /\<mono\>/){Pnr=NR;gsub(/^.*\<mono\>/,"mono"); P=$0;next}
     (!Nnr && $0 ~ /\/\<mono\>/){Nnr=NR;gsub(/\/\<mono\>.*/,"/mono"); N=$0}
     (NR!=FNR && P){print P;P=""}(FNR>Pnr && FNR <Nnr ){print} END{print N}' in in 

Resultará o que há entre mono ~ /mono : primeiras ocorrências em torno da linha específica # 4 aqui.

mono
not monoono
above a specified line #
and look for the
first occurrence of word /mono

Se você não quisesse linhas correspondentes após o padrão , seria mais curto:

awk -v L=4 '(NR<L && $0 ~ /\<mono\>/){Pnr=NR;next}
    (!Nnr && $0 ~ /\/\<mono\>/){Nnr=NR}
    (FNR>Pnr && FNR <Nnr)' in in
    
por 15.09.2017 / 10:58