sed - como imprimir o bloco de texto do segundo padrão?

1

Eu tenho uma página html que contém duas tabelas.

Ambas as tabelas começam com a mesma tag " <table role="grid"> " e eu quero exibir o segundo código da tabela.

Por enquanto, só sei exibir o primeiro com:

sed -n '/<table role=\"grid\">/,/<\/table>/p' page.html

Como você faria?

    
por Body 27.09.2015 / 16:38

2 respostas

1

Isso funciona, mas tenho certeza de que deve haver uma solução mais simples:

sed -n '/<table role=\"grid\">/{
 x
 /^$/b
 x
:loop
 p
 /<\/table>/q
 n
 b loop
}'

Ao combinar table , a linha é trocada (x) pelo espaço de espera e os conteúdos antigos são comparados. Eles estarão vazios (/ ^ $ /) pela primeira vez, então nós nos ramificamos (b) até o final do script. Na próxima vez, o porão não estar vazio (tem a primeira linha da tabela). Então desfazemos a troca (x) e começamos um loop onde a linha é impressa (p), até que o final da tabela seja correspondido quando paramos (q). Cada vez que recebemos a próxima linha (n) e ramificação de volta para o rótulo de loop.

É mais simples no awk:

awk '/<table role=\"grid\">/,/<\/table>/ { if(n==1)print }
     /<\/table>/ { n++ }'
    
por 27.09.2015 / 17:06
1

Eu usaria perl :

perl -ne 'if(/<table role="grid">/){$i++;$k=1} 
          if($i==2 && $k==1){print} 
          if(/<\/table>/){$k=0;}' file

Explicação

  • perl -ne : leia o arquivo de entrada linha a linha e aplique o script fornecido por -e em cada linha.
  • if(/<table role="grid">/){$i++;$k=1} : se esta linha corresponder a <table role="grid"> , adicione 1 ao valor de $i e defina $k como 1.
  • if($i==2 && $k==1){print} : se o valor atual de $i for 2 e o de $k for 1 (portanto, se estivermos entre um <table role="grid"> e um </table> e se for a segunda vez que <table role="grid"> tem visto), imprima a linha atual.
  • if(/<\/table>/){$k=0;} : defina $k de volta para 0 se essa linha corresponder a </table> .
por 27.09.2015 / 17:14

Tags