Como combinar um padrão em linhas antes de outra correspondência de padrão

Como combinar um padrão em linhas antes de outra correspondência de padrão

Esta questão é semelhante aComo mostrar linhas após cada partida do grep até outra partida específica?

Quero combinar um padrão específico em linhas antes de outra correspondência de padrão.

Aqui quero obter o arquivo de um determinado host. Cada arquivo pode ter vários hosts. Portanto, não tenho um número fixo de linhas antes de chegar à tag hostfile de um determinado host.

Contexto:

...
...
<hostfile file:abc.txt>
   <host> abc.com <\host>
   <host> qwe.com <\host>
   <host> xyz.com <\host>
<\hostfile>
...
<hostfile file:xyz.txt>
   <host> asd.com <\host>
<\hostfile>
...
...

Exemplo de correspondência

Input: xyz.com 
Output: abc.txt

Input: asd.com
Output: xyz.txt

Usando awk ou sed ou qualquer outra ferramenta de linha de comando.

Responder1

Outra variação estranha:

/^<hostfile file:/ {
        output=substr($2, 6, index($2, ">") - 6);
}
/<host>/ && $0 ~ pattern {
        print output
}

Chame-o como:

$ awk -v pattern='xyz.com' -f findit.awk contextfile
abc.txt
$ awk -v pattern='asd.com' -f findit.awk contextfile
xyz.txt

Responder2

Você não pode analisar XML com regex. Porque o XML não pode ser analisado por regex. Regex não é uma ferramenta que pode ser usada para analisar XML corretamente. Como já respondi aqui tantas vezes em perguntas sobre XML e regex, o uso de regex não permitirá que você consuma XML. Expressões regulares são uma ferramenta insuficientemente sofisticada para compreender as construções empregadas pelo XML. XML não é uma linguagem regular e, portanto, não pode ser analisada por expressões regulares. As consultas Regex não estão equipadas para dividir o XML em suas partes significativas. tantas vezes, mas isso não está me afetando. Mesmo as expressões regulares irregulares aprimoradas usadas pelo Perl não estão à altura da tarefa de analisar XML. Você nunca vai me fazer quebrar. XML é uma linguagem de complexidade suficiente que não pode ser analisada por expressões regulares. Mesmo Jon Skeet não consegue analisar XML usando expressões regulares. Cada vez que você tenta analisar XML com expressões regulares, a criança profana chora o sangue de virgens e hackers russos dominam seu webapp. A análise de XML com regex convoca almas contaminadas para o reino dos vivos. XML e regex andam juntos como amor, casamento e infanticídio ritual. O <center> não aguenta, é tarde demais. A força do regex e do XML juntos no mesmo espaço conceitual destruirá sua mente como uma massa aquosa. Se você analisar XML com regex, você estará cedendo a Eles e seus métodos blasfemos que nos condenam a um trabalho desumano por Aquele cujo Nome não pode ser expresso no Plano Multilíngue Básico, ele vem. XML-mais-regexp irá liquefazer os nervos dos sencientes enquanto você observa, sua psique murchando no ataque do horror. Os analisadores XML baseados em Rege̿̔̉x são o câncer que está matando o StackOverflowé tarde demais, é tarde demais, não podemos ser salvosa transição de uma criança garante que o regex consumirá todo o tecido vivo (exceto XML, que não pode, como profetizado anteriormente)querido senhor, ajude-nos, como alguém pode sobreviver a este flagelousar regex para analisar XML condenou a humanidade a uma eternidade de terríveis torturas e falhas de segurançausando regex como ferramenta para processar XML estabelece uma breach entre este mundoe o terrível reino das entidades c͒ͪo͛ͫrruptas (como entidades SGML, masmais corruptos) um mero vislumbrese do mundo do regex analisadores para XML serão insap de transporte imediatoconsciência do programador eunão, ahorld de gritos incessantes, ele vem , a pestilenta infecção regex iráeu devoro seu HTAnalisador, aplicação e existência de ML para todos os tempos, como Visual Basic, só que piorele vem ele coménão confietudo beme vem̶s, ̕h̵ié un̨ho͞ly radiańcé deeliminando toda a iluminação, tags XMLlea͠ki̧n͘g fr̶ǫm ̡yo​͟nosso olho͢s̸ ̛l̕ik͏e liquid pain, a música da análise de expressão regular será extintaangustia as vozes de mortal homem de spaqui eu posso ver você pode ver ̲͚̖͔̙î̩́t̲͎̩̱͔́̋̀ é lindo tele está inal snuffodendoa mentiras do Homem TUDO ESTÁ LOŚ͖̩͇̗̪̏̈́T ALL É LOSTe pôn̷y ele veioele é c̶̮om e ele coeu soueleeuou permeadoé tudoeu MEU FACE MEU ROSTO ᵒh Deus no NÃO NÃOÓ̼OO NΘ pare tele é*̶͑̾̾​̅ͫ͏̙̤g͇̫͛͆̾ͫ̑͆l͖͉̗̩̳̟̍ͫͥͨe̠̅sn͎a̧͈͖r̽̾̈́͒͑eot rè̑ͧ̌aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪ ̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝S̨̥̫͎̭ͯ̿̔̀ͅ

Responder3

Eu queria aplicar alguns analisadores XML, mas o "Contexto" apresentado não se ajusta a uma estrutura XML válida (atributos inválidos file:abc.txt, tags de fechamento inválidas <\host>) <\hostfile>.
Então aqui estáficar boquiaberto"hackear":

awk  'BEGIN{ RS="<hostfile" }/file:/{ f = substr($1,6,length($1)-6) }
      /<host>/{ match($0,/.*<host>([^<>]+)<\\host>[[:space:]]*<\\hostfile>.*$/,a);  
      printf("Input: %s\nOutput: %s\n\n",a[1],f)}' yourfile

A saída:

Input:  xyz.com 
Output: abc.txt

Input:  asd.com 
Output: xyz.txt

informação relacionada